1
2
3
4
5
6
7
8
9
10
11 package java.util.concurrent;
12
13
14
15
16
17 public enum TimeUnit {
18 NANOSECONDS {
19 public long toNanos(long d) { return d; }
20 public long toMicros(long d) { return d/(C1/C0); }
21 public long toMillis(long d) { return d/(C2/C0); }
22 public long toSeconds(long d) { return d/(C3/C0); }
23 public long toMinutes(long d) { return d/(C4/C0); }
24 public long toHours(long d) { return d/(C5/C0); }
25 public long toDays(long d) { return d/(C6/C0); }
26 public long convert(long d, TimeUnit u) { return u.toNanos(d); }
27 int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
28 },
29 MICROSECONDS {
30 public long toNanos(long d) { return x(d, C1/C0, MAX/(C1/C0)); }
31 public long toMicros(long d) { return d; }
32 public long toMillis(long d) { return d/(C2/C1); }
33 public long toSeconds(long d) { return d/(C3/C1); }
34 public long toMinutes(long d) { return d/(C4/C1); }
35 public long toHours(long d) { return d/(C5/C1); }
36 public long toDays(long d) { return d/(C6/C1); }
37 public long convert(long d, TimeUnit u) { return u.toMicros(d); }
38 int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
39 },
40 MILLISECONDS {
41 public long toNanos(long d) { return x(d, C2/C0, MAX/(C2/C0)); }
42 public long toMicros(long d) { return x(d, C2/C1, MAX/(C2/C1)); }
43 public long toMillis(long d) { return d; }
44 public long toSeconds(long d) { return d/(C3/C2); }
45 public long toMinutes(long d) { return d/(C4/C2); }
46 public long toHours(long d) { return d/(C5/C2); }
47 public long toDays(long d) { return d/(C6/C2); }
48 public long convert(long d, TimeUnit u) { return u.toMillis(d); }
49 int excessNanos(long d, long m) { return 0; }
50 },
51 SECONDS {
52 public long toNanos(long d) { return x(d, C3/C0, MAX/(C3/C0)); }
53 public long toMicros(long d) { return x(d, C3/C1, MAX/(C3/C1)); }
54 public long toMillis(long d) { return x(d, C3/C2, MAX/(C3/C2)); }
55 public long toSeconds(long d) { return d; }
56 public long toMinutes(long d) { return d/(C4/C3); }
57 public long toHours(long d) { return d/(C5/C3); }
58 public long toDays(long d) { return d/(C6/C3); }
59 public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
60 int excessNanos(long d, long m) { return 0; }
61 },
62 MINUTES {
63 public long toNanos(long d) { return x(d, C4/C0, MAX/(C4/C0)); }
64 public long toMicros(long d) { return x(d, C4/C1, MAX/(C4/C1)); }
65 public long toMillis(long d) { return x(d, C4/C2, MAX/(C4/C2)); }
66 public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
67 public long toMinutes(long d) { return d; }
68 public long toHours(long d) { return d/(C5/C4); }
69 public long toDays(long d) { return d/(C6/C4); }
70 public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
71 int excessNanos(long d, long m) { return 0; }
72 },
73 HOURS {
74 public long toNanos(long d) { return x(d, C5/C0, MAX/(C5/C0)); }
75 public long toMicros(long d) { return x(d, C5/C1, MAX/(C5/C1)); }
76 public long toMillis(long d) { return x(d, C5/C2, MAX/(C5/C2)); }
77 public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
78 public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
79 public long toHours(long d) { return d; }
80 public long toDays(long d) { return d/(C6/C5); }
81 public long convert(long d, TimeUnit u) { return u.toHours(d); }
82 int excessNanos(long d, long m) { return 0; }
83 },
84 DAYS {
85 public long toNanos(long d) { return x(d, C6/C0, MAX/(C6/C0)); }
86 public long toMicros(long d) { return x(d, C6/C1, MAX/(C6/C1)); }
87 public long toMillis(long d) { return x(d, C6/C2, MAX/(C6/C2)); }
88 public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
89 public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
90 public long toHours(long d) { return x(d, C6/C5, MAX/(C6/C5)); }
91 public long toDays(long d) { return d; }
92 public long convert(long d, TimeUnit u) { return u.toDays(d); }
93 int excessNanos(long d, long m) { return 0; }
94 };
95
96
97 static final long C0 = 1L;
98 static final long C1 = C0 * 1000L;
99 static final long C2 = C1 * 1000L;
100 static final long C3 = C2 * 1000L;
101 static final long C4 = C3 * 60L;
102 static final long C5 = C4 * 60L;
103 static final long C6 = C5 * 24L;
104
105 static final long MAX = Long.MAX_VALUE;
106
107 static long x(long d, long m, long over) {
108 if (d > over) return Long.MAX_VALUE;
109 if (d < -over) return Long.MIN_VALUE;
110 return d * m;
111 }
112
113
114
115 public long convert(long sourceDuration, TimeUnit sourceUnit) {
116 throw new AssertionError();
117 }
118
119 public long toNanos(long duration) {
120 throw new AssertionError();
121 }
122
123 public long toMicros(long duration) {
124 throw new AssertionError();
125 }
126
127 public long toMillis(long duration) {
128 throw new AssertionError();
129 }
130
131 public long toSeconds(long duration) {
132 throw new AssertionError();
133 }
134
135 public long toMinutes(long duration) {
136 throw new AssertionError();
137 }
138
139 public long toHours(long duration) {
140 throw new AssertionError();
141 }
142
143 public long toDays(long duration) {
144 throw new AssertionError();
145 }
146
147 abstract int excessNanos(long d, long m);
148 }