Date.from (ZonedDateTime to instant) возвращение предыдущего дня - PullRequest
0 голосов
/ 25 апреля 2019

Моя переменная в Java типа ZonedDateTime говорит time="2017-01-03T00:00Z[UTZ]".И когда я пытаюсь получить Date из этого - Date.from(time.toInstance()) возвращает предыдущий день, т.е. Mon Jan 02 19:00:00 EST 2017, я не знаю почему?Может ли кто-нибудь пролить свет на мое возвращение накануне?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

ZonedDateTime.toInstant () настраивает момент от часового пояса до UTC. Вы получите один и тот же момент, другое время на настенных часах и, возможно, другую дату для одной и той же точки на временной шкале. То, что вы видите, не проблема, не несоответствие.

Классы, такие как LocalDate и ZonedDateTime, обеспечивают человеческое представление о времени. Однако часто нам нужно работать со временем, если смотреть с точки зрения машины. Для этого мы можем использовать класс Instant, который представляет временные метки.

Мгновенное значение отсчитывает время, начиная с первой секунды 1 января 1970 года (1970-01-01 00:00:00), также называемое ЭПОХА.

Мгновенные значения могут быть отрицательными, если они произошли до эпохи. Они соответствуют стандарту ISO 8601 для представления даты и времени.

Кроме того, используйте библиотеки API времени Java, представленные в Java 8, поскольку было много проблем в существующих API даты и календаря. Пожалуйста, см .: https://www.baeldung.com/java-8-date-time-intro

0 голосов
/ 26 апреля 2019

Избегайте устаревших классов даты и времени

Никогда не используйте java.util.Date class. Этот ужасный класс вместе с Calendar & SimpleDateFormat и другими теперь унаследован.Новые методы преобразования to / from, добавленные в старые классы, предназначены только для использования при взаимодействии со старым кодом, который еще не обновлен до java.time .По возможности избегайте Date.

Среди многих недостатков в Date - неудачное поведение динамического применения текущего часового пояса JVM по умолчанию при генерации текста в его методе toString.Таким образом, кажется, что Date имеет часовой пояс, в то время как на самом деле Date представляет момент в UTC. Другими словами, Date::toString ложь. Одна из многих причин избегать этого класса.

➥ Зимой 2017 года многие часовые пояса наВосточное побережье Северной Америки отстает от UTC на пять часов.Таким образом, полночь в UTC - это одновременно в 7 часов вечера (19:00) в Нью-Йорке, Монреале и т. Д. Тот же самый момент, разное время настенных часов.*

Класс Date был вытеснен Instant лет назад.

ZonedDateTime is say time = "2017-01-03T00: 00Z [UTZ]"

Если вы пытаетесь отслеживать моменты в UTC , используйте:

  • InstantInstant.now()
  • OffsetDateTime объект установлен в UTC.OffsetDateTime.now( ZoneOffset.UTC )

Используйте класс ZonedDateTime, когда у вас есть момент в контексте часового пояса. часовой пояс - это история прошлых, настоящих и будущих изменений в offset-from-UTC , используемых людьми определенного региона.

ZonedDateTime.now( 
    ZoneId.of( "Africa/Tunis" )
)

Вы можете настроить между UTC и зоной.Один и тот же момент, разные способы его просмотра, разное время настенных часов.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

… и…

Instant instant = zdt.toInstant() ;

Table of date-time types in Java, both modern and legacy


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...