|
18 | 18 |
|
19 | 19 | import java.time.DateTimeException; |
20 | 20 | import java.time.temporal.ChronoField; |
| 21 | +import java.time.temporal.ChronoUnit; |
21 | 22 | import java.time.temporal.Temporal; |
22 | 23 | import java.time.temporal.ValueRange; |
23 | 24 | import java.util.function.BiFunction; |
@@ -168,22 +169,25 @@ protected static <T extends Temporal & Comparable<? super T>> T cast(Temporal te |
168 | 169 | * day-of-month, month, day-of-week. |
169 | 170 | */ |
170 | 171 | protected enum Type { |
171 | | - NANO(ChronoField.NANO_OF_SECOND), |
172 | | - SECOND(ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
173 | | - MINUTE(ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
174 | | - HOUR(ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
175 | | - DAY_OF_MONTH(ChronoField.DAY_OF_MONTH, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
176 | | - MONTH(ChronoField.MONTH_OF_YEAR, ChronoField.DAY_OF_MONTH, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
177 | | - DAY_OF_WEEK(ChronoField.DAY_OF_WEEK, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND); |
| 172 | + NANO(ChronoField.NANO_OF_SECOND, ChronoUnit.SECONDS), |
| 173 | + SECOND(ChronoField.SECOND_OF_MINUTE, ChronoUnit.MINUTES, ChronoField.NANO_OF_SECOND), |
| 174 | + MINUTE(ChronoField.MINUTE_OF_HOUR, ChronoUnit.HOURS, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
| 175 | + HOUR(ChronoField.HOUR_OF_DAY, ChronoUnit.DAYS, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
| 176 | + DAY_OF_MONTH(ChronoField.DAY_OF_MONTH, ChronoUnit.MONTHS, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
| 177 | + MONTH(ChronoField.MONTH_OF_YEAR, ChronoUnit.YEARS, ChronoField.DAY_OF_MONTH, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND), |
| 178 | + DAY_OF_WEEK(ChronoField.DAY_OF_WEEK, ChronoUnit.WEEKS, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND); |
178 | 179 |
|
179 | 180 |
|
180 | 181 | private final ChronoField field; |
181 | 182 |
|
| 183 | + private final ChronoUnit higherOrder; |
| 184 | + |
182 | 185 | private final ChronoField[] lowerOrders; |
183 | 186 |
|
184 | 187 |
|
185 | | - Type(ChronoField field, ChronoField... lowerOrders) { |
| 188 | + Type(ChronoField field, ChronoUnit higherOrder, ChronoField... lowerOrders) { |
186 | 189 | this.field = field; |
| 190 | + this.higherOrder = higherOrder; |
187 | 191 | this.lowerOrders = lowerOrders; |
188 | 192 | } |
189 | 193 |
|
@@ -266,17 +270,9 @@ public <T extends Temporal & Comparable<? super T>> T elapseUntil(T temporal, in |
266 | 270 | * @return the rolled forward temporal |
267 | 271 | */ |
268 | 272 | public <T extends Temporal & Comparable<? super T>> T rollForward(T temporal) { |
269 | | - int current = get(temporal); |
270 | | - ValueRange range = temporal.range(this.field); |
271 | | - long amount = range.getMaximum() - current + 1; |
272 | | - T result = this.field.getBaseUnit().addTo(temporal, amount); |
273 | | - current = get(result); |
274 | | - range = result.range(this.field); |
275 | | - // adjust for daylight savings |
276 | | - if (current != range.getMinimum()) { |
277 | | - result = this.field.adjustInto(result, range.getMinimum()); |
278 | | - } |
279 | | - return result; |
| 273 | + T result = this.higherOrder.addTo(temporal, 1); |
| 274 | + ValueRange range = result.range(this.field); |
| 275 | + return this.field.adjustInto(result, range.getMinimum()); |
280 | 276 | } |
281 | 277 |
|
282 | 278 | /** |
|
0 commit comments