@@ -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,32 @@ 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
+ // since time units are powers of ten, we can get rounding errors here, so fuzzy match
206
+ if (convertValue (value , unit , unitToTest ) > 0.9999 ) {
207
+ unitToUse = unitToTest ;
208
+ }
209
+ else {
210
+ break ;
211
+ }
212
+ }
213
+ return unitToUse ;
214
+ }
215
+
216
+ private static double convertValue (double value , TimeUnit fromUnit , TimeUnit toUnit )
217
+ {
218
+ requireNonNull (fromUnit , "fromUnit is null" );
219
+ requireNonNull (toUnit , "toUnit is null" );
220
+ if (fromUnit == toUnit ) {
221
+ return value ;
222
+ }
223
+
224
+ return value * (millisPerTimeUnit (fromUnit ) / millisPerTimeUnit (toUnit ));
225
+ }
226
+
207
227
@ Override
208
228
public int compareTo (Duration o )
209
229
{
0 commit comments