Неправильный класс: LocalDateTime
Никогда не используйте LocalDateTime
для отслеживания фактического момента. Не имея понятия часового пояса или смещения от UTC, LocalDateTime
не можетпредставлять момент.LocalDateTime
может знать «полдень 23 января 2019 года», но не знает, если вы имеете в виду полдень в Токио, Япония, полдень в Тунисе Тунис или полдень в Монреале-Квебеке - три совершенно разных момента,каждый разделен на несколько часов.
Слово «Локальный» в LocalDateTime
означает любой населенный пункт или каждый населенный пункт.Но это не означает какую-то одну конкретную местность.
Правильный класс: ZonedDateTime
Для отслеживания моментов используйте Instant
(всегда в UTC) или ZonedDateTime
(или, возможно, OffsetDateTime
).
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen through the wall-clock time used by the people of a particular region (a time zone).
Instant instant = zdt.toInstant() ; // Adjust from a zone to UTC, if needed. An `Instant` is always in UTC by definition.
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.Если критично, подтвердите зону с вашим пользователем.
Автоматическая локализация
Класс DateTimeFormatter
может автоматически локализоваться при генерации текста, представляющего значение объекта даты-времени.
Для локализации укажите:
FormatStyle
, чтобы определить, как долго или сокращенно должна быть строка. Locale
определить: - человеческий язык для перевода названия дня, названия месяца и т. д.
- культурных норм решение вопросов оаббревиатура, заглавные буквы, пунктуация, разделители и т. д.
Пример:
Locale l = Locale.CANADA_FRENCH ; // Or Locale.US, Locale.JAPAN, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
.withLocale( l );
String output = zdt.format( f );
Уточните, что языковой стандарт и часовой пояс не имеют ничего делать друг с другом - ортогональные вопросы.Инженер из Квебека, участвующий в конференции в Индии, может захотеть увидеть расписание событий, представленное на ее родном французском языке, с канадскими культурными нормами и с указанием даты и времени в местном индийском часовом поясе.
About 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?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .