1 /*
2  * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package jdk.jfr.internal.consumer;
27 
28 import java.time.DateTimeException;
29 import java.time.ZoneOffset;
30 
31 import jdk.jfr.internal.LogLevel;
32 import jdk.jfr.internal.LogTag;
33 import jdk.jfr.internal.Logger;
34 
35 /**
36  * Converts ticks to nanoseconds
37  */
38 final class TimeConverter {
39     private final long startTicks;
40     private final long startNanos;
41     private final double divisor;
42     private final ZoneOffset zoneOffset;
43 
TimeConverter(ChunkHeader chunkHeader, int rawOffset)44     TimeConverter(ChunkHeader chunkHeader, int rawOffset) {
45         this.startTicks = chunkHeader.getStartTicks();
46         this.startNanos = chunkHeader.getStartNanos();
47         this.divisor = chunkHeader.getTicksPerSecond() / 1000_000_000L;
48         this.zoneOffset = zoneOfSet(rawOffset);
49     }
50 
convertTimestamp(long ticks)51     public long convertTimestamp(long ticks) {
52         return startNanos + (long) ((ticks - startTicks) / divisor);
53     }
54 
convertTimespan(long ticks)55     public long convertTimespan(long ticks) {
56         return (long) (ticks / divisor);
57     }
58 
getZoneOffset()59     public ZoneOffset getZoneOffset() {
60         return zoneOffset;
61     }
62 
zoneOfSet(int rawOffset)63     private ZoneOffset zoneOfSet(int rawOffset) {
64         try {
65             return ZoneOffset.ofTotalSeconds(rawOffset / 1000);
66         } catch (DateTimeException dte) {
67             Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Could not create ZoneOffset from raw offset " + rawOffset);
68         }
69         return ZoneOffset.UTC;
70     }
71 }
72