LocalDateTime.now () неправильный час - PullRequest
0 голосов
/ 28 сентября 2018

Я использую LocalDateTime.now(), чтобы получить дату и время системы, но время с часом в прошлом.

Если у системы 14:52, now() возврат 13:52.

ОС системы - Windows 10.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

LocalDateTime неправильный класс

Никогда не используйте LocalDateTime для представления момента, определенной точки на временной шкале.Умышленно не имея представления о часовом поясе или о смещении от UTC, этот тип представляет потенциальных моментов в диапазоне около 26-27 часов (диапазон часовых поясов по всему миру).

Текущий момент

Чтобы получить текущий момент в UTC, используйте Instant.

Instant instant = Instant.now() ;

Чтобы получить текущий момент, как видно на часах настенного времени, используемых людьми в определенном регионе.(часовой пояс), используйте ZonedDateTime.

Я подозреваю, что ваша проблема в том, что ваш ожидаемый часовой пояс на самом деле не был текущим поясом по умолчанию, когда выполнялся ваш код.В вашем коде вы не указали часовой пояс, поэтому текущий часовой пояс JVM по умолчанию был применен без вывода сообщений.Вы можете проверить текущее значение по умолчанию, позвонив ZoneId.systemDefault().toString().

На мой взгляд, неявная зависимость от текущего часового пояса JVM по умолчанию является плохой практикой.Лучше всегда указывать желаемый / ожидаемый часовой пояс явно.Всегда передавайте необязательный аргумент ZoneId.

ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or get the JVM’s current default time zone: ZoneId.systemDefault() 
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

О java.time

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

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

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

Вы можете обмениваться 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 .

0 голосов
/ 28 сентября 2018

java.util.TimeZone.setDefault() - это метод в Java, который используется для установки часового пояса в Java.Он принимает TimeZone в качестве входного параметра.Вы можете получить объект TimeZone по TimeZone.getTimeZone("id"); Для разных часовых поясов существуют разные идентификаторы.Например, id для меня это " Азия / Калькутта ", поэтому прохождение, которое вернет мне TimeZone моего региона.

TimeZone tzone = TimeZone.getTimeZone("Asia/Calcutta");
TimeZone.setDefault(tzone);

Над строкой изменитсямой часовой пояс для региона вычислений.

...