@@ -63,7 +63,12 @@ public static Duration succinctDuration(double value, TimeUnit unit)
63
63
if (value == 0 ) {
64
64
return ZERO ;
65
65
}
66
- return new Duration (value , unit ).convertToMostSuccinctTimeUnit ();
66
+
67
+ TimeUnit succinctUnit = succinctUnit (value , unit );
68
+ if (succinctUnit == unit ) {
69
+ return new Duration (value , unit );
70
+ }
71
+ return new Duration (convertValue (value , unit , succinctUnit ), succinctUnit );
67
72
}
68
73
69
74
private final double value ;
@@ -101,8 +106,7 @@ public TimeUnit getUnit()
101
106
102
107
public double getValue (TimeUnit timeUnit )
103
108
{
104
- requireNonNull (timeUnit , "timeUnit is null" );
105
- return value * (millisPerTimeUnit (this .unit ) / millisPerTimeUnit (timeUnit ));
109
+ return convertValue (value , unit , timeUnit );
106
110
}
107
111
108
112
public long roundTo (TimeUnit timeUnit )
@@ -125,17 +129,7 @@ public Duration convertTo(TimeUnit timeUnit)
125
129
126
130
public Duration convertToMostSuccinctTimeUnit ()
127
131
{
128
- TimeUnit unitToUse = NANOSECONDS ;
129
- for (TimeUnit unitToTest : TIME_UNITS ) {
130
- // since time units are powers of ten, we can get rounding errors here, so fuzzy match
131
- if (getValue (unitToTest ) > 0.9999 ) {
132
- unitToUse = unitToTest ;
133
- }
134
- else {
135
- break ;
136
- }
137
- }
138
- return convertTo (unitToUse );
132
+ return convertTo (succinctUnit (value , unit ));
139
133
}
140
134
141
135
public java .time .Duration toJavaTime ()
@@ -204,6 +198,31 @@ public static Duration valueOf(String duration)
204
198
return new Duration (value , timeUnit );
205
199
}
206
200
201
+ private static TimeUnit succinctUnit (double value , TimeUnit unit )
202
+ {
203
+ TimeUnit unitToUse = NANOSECONDS ;
204
+ for (TimeUnit unitToTest : TIME_UNITS ) {
205
+ if (convertValue (value , unit , unitToTest ) > 0.9999 ) {
206
+ unitToUse = unitToTest ;
207
+ }
208
+ else {
209
+ break ;
210
+ }
211
+ }
212
+ return unitToUse ;
213
+ }
214
+
215
+ private static double convertValue (double value , TimeUnit fromUnit , TimeUnit toUnit )
216
+ {
217
+ requireNonNull (fromUnit , "fromUnit is null" );
218
+ requireNonNull (toUnit , "toUnit is null" );
219
+ if (fromUnit == toUnit ) {
220
+ return value ;
221
+ }
222
+
223
+ return value * (millisPerTimeUnit (fromUnit ) / millisPerTimeUnit (toUnit ));
224
+ }
225
+
207
226
@ Override
208
227
public int compareTo (Duration o )
209
228
{
0 commit comments