Я пытаюсь добавить несколько лет к текущему времени. Мой код выглядит так:
// ten yeas ago
int backYears = 10;
Instant instant = ChronoUnit.YEARS.addTo(Instant.now(), -backYears);
Но у меня есть исключение:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
at java.time.Instant.plus(Instant.java:862)
Когда я открыл метод Instant.plus
, я вижу следующее:
@Override
public Instant plus(long amountToAdd, TemporalUnit unit) {
if (unit instanceof ChronoUnit) {
switch ((ChronoUnit) unit) {
case NANOS: return plusNanos(amountToAdd);
case MICROS: return plus(amountToAdd / 1000_000, (amountToAdd % 1000_000) * 1000);
case MILLIS: return plusMillis(amountToAdd);
case SECONDS: return plusSeconds(amountToAdd);
case MINUTES: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_MINUTE));
case HOURS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_HOUR));
case HALF_DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY / 2));
case DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY));
}
throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
}
return unit.addTo(this, amountToAdd);
}
Как видите, MONTHS
и YEARS
не поддерживаются. Но почему? Со старым java.util.Calendar
я могу сделать это легко:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, amount);
return c.getTime();
Единственная причина, по которой я думаю, заключается в том, что мы не знаем, сколько дней в месяце и году из-за високосного дня 29 февраля. Но, если честно, у нас также есть високосная секунда. Таким образом, я думаю, что это ошибка, и все ChronoUnit
должны поддерживаться. Вопрос только один: нужно ли учитывать високосную секунду и високосный день. Что касается моих потребностей, то можно просто предположить, что в месяце 30 дней, а в году 365. Мне не нужно делать что-то вроде Calendar.roll()
, но это тоже может меня удовлетворить.
ZonedDateTime
,OffsetDateTime
иLocalDateTime
, умеют обрабатывать месяцы и годы, поэтому используйте их для добавления таких единиц. - person Ole V.V.   schedule 11.11.2017