|
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