В других комментариях и ответах совершенно верно сказать, что год не всегда равен 365 дням.
Метод Time4J net.time4j.Duration.from (TemporalAmount) возвращает нормализованную продолжительность, используя STD_PERIOD
в качестве нормализатора.Документация этого нормализатора гласит:
Нормализует элементы длительности на основе 1 года = 12 месяцев и 1 дня = 24 часа и 1 часа = 60 минут и 1 минуты = 60 секунд - без преобразованиядней до месяцев.
Таким образом, вы можете ожидать, что результат будет только в днях, когда вы начнете с временной суммы, определенной в секундах.
Если вам все еще нужен год, тогда я предлагаюВы должны сначала преобразовать свои моменты в календарные даты, используя соответствующий часовой пояс.Но в високосные годы ваш код будет генерировать 365 дней, а не год после добавления 60 * 60 * 24 * 365
секунд ко второму мгновению.Поэтому добавление секунд также является ошибочным, поскольку оно основано на ложных предположениях.
Примечание:
Если вы хотите использовать обратный путь, а именно, сколько секунд в году, то вы можете использоватькод типа
Moment m1 = Moment.nowInSystemTime();
Moment m2 = m1.toZonalTimestamp(ZonalOffset.UTC).plus(1, CalendarUnit.YEARS).atUTC();
long seconds = SI.SECONDS.between(m1, m2); // = 366 days in seconds if applied on date 2019-05-22!
В будущей версии Time4J и возможной дополнительной секунде в конце 2019 года код может даже дать дополнительную секунду.
В любом случае, я советую вам обновитьВремя от 4J до v5.4 и рассмотрите следующие сопоставления:
java.time.Instant as input => net.time4j.MachineTime.from(...)
java.time.LocalDateTime/net.time4j.PlainTimestamp => net.time4j.Duration.from(...)
Так что, если вы действительно хотите, чтобы годы выводились в виде длительностей печати, и у вас есть моменты / моменты, то сначала преобразуйте в LocalDateTime / PlainTimestamp (используя часовой пояс илисмещение) перед созданием соответствующего объекта длительности.
Обновление с 2019-05-25:
Другой способ с версией v5.4 (или более поздней) возможен через "нечеткие" длительности.Вы можете нормализовать длительности, которые вы получаете, применяя приближение.Пример:
Duration<IsoUnit> d = Duration.of(60 * 60 * 24 * 365, ClockUnit.SECONDS);
d = d.with(Duration.approximateMaxUnitOnly());
System.out.println(d); // P1Y
Из-за характера нормализации такого типа нельзя ожидать точных результатов.