Как я могу подвести итог двух ZoneOffset?
У меня есть два объекта ZoneOffset, разобранных из строк. Как я могу суммировать их и применить к ZonedDateTime?
Например:
оригинальный ZonedDateTime является 2017-12-27T18:30:00
первое смещение +03
второе смещение +05
Как я могу получить вывод 2017-12-28T18:30:00+08:00
или же 2017-12-28T10:30:00
?
1 ответ
Я понимаю ваш вопрос таким образом (пожалуйста, проверьте, правильно ли): У вас есть один ZonedDateTime
с обычным смещением от UTC. Я назову это dateTimeWithBaseOffset
, И у вас есть еще один ZonedDateTime
со смещением относительно смещения первого ZonedDateTime
, Это действительно неверно; дизайнеры класса решили, что смещение от UTC, но кто-то использовал его не так, как предполагалось. Я позвоню последнему dateTimeWithOffsetFromBase
,
Лучше всего, если вы можете исправить код, который произвел dateTimeWithOffsetFromBase
с неортодоксальным смещением. Я предполагаю, что пока это не будет решением, которое вы можете использовать. Таким образом, вам нужно исправить неправильное смещение в смещение от UTC.
Это не плохо:
ZoneOffset baseOffset = dateTimeWithBaseOffset.getOffset();
ZoneOffset additionalOffset = dateTimeWithOffsetFromBase.getOffset();
ZoneOffset correctedOffset = ZoneOffset.ofTotalSeconds(baseOffset.getTotalSeconds()
+ additionalOffset.getTotalSeconds());
OffsetDateTime correctedDateTime = dateTimeWithOffsetFromBase.toOffsetDateTime()
.withOffsetSameLocal(correctedOffset);
System.out.println(correctedDateTime);
Используя ваши образцы даты и времени, это печатает
2017-12-28T18:30+08:00
Если вы хотите время в UTC:
correctedDateTime = correctedDateTime.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println(correctedDateTime);
Это печатает дату и время, которое вы просили:
2017-12-28T10:30Z
Для даты-времени со смещением нам не нужно использовать ZonedDateTime
, OffsetDateTime
будет делать и может сообщить читателю, что мы собираемся сделать лучше (ZonedDateTime
работает тоже, хотя).