tl; dr
Используйте UTC
Думайте UTC как «одно истинное время».Любая дата-время для определенного часового пояса является производной от UTC.Когда на работе занимаешься программированием или сисадмином, забудь о своем местном часовом поясе.Я настоятельно рекомендую добавить часы как на физическом, так и на цифровом рабочем столе, отображающем UTC.В крайнем случае, используйте веб-сайт, такой как Time.is .
Большая часть вашей бизнес-логики, ведения журналов, хранения данных, обмена данными и сохранения базы данных должна быть в формате UTC.Настройте часовой пояс только для презентации.
Избегайте старых классов даты и времени
Избегайте проблемных старых устаревших классов даты и времени, связанных с самыми ранними версиями Java.Теперь вытесняется классами java.time.
Instant
Класс Instant
представляет момент на временной шкале в UTC сразрешение наносекунд .
Instant now = Instant.now(); // Current moment in UTC.
Укажите часовой пояс
Виртуальная машина Java имеет текущий часовой пояс по умолчанию.Это может быть обнаружено при запуске с хост-ОС.Или это может быть установлено при запуске настройками конфигурации.Или это может быть изменено в любой момент любым кодом в любом потоке любого приложения в JVM - влияя на весь другой код во время выполнения!
Учитывая, что текущий часовой пояс JVM по умолчанию изменяется и находится вне вашего контроля программиста, никогда не зависите от него. Всегда указывайте желаемый / ожидаемый часовой пояс .
Как правило, лучше всего, чтобы на хост-сервере сервера был установлен часовой пояс UTC, но, опять же, никогда не зависите от этого в ваших программах.
ZonedDateTime
Чтобы настроить Instant
на часовой пояс, сгенерируйте объект ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Вызовите toString
для генерации строки в стандартном *Формат 1077 * ISO 8601 .Для других форматов выполните поиск переполнения стека для класса DateTimeFormatter
.
Обновите tz
базу данных часовых поясов
Определения часовых поясов и их аномалии, такие как Летнее время (летнее время)) меняются часто, на удивление часто.
Oracle выпускает регулярные обновления Java, которые включают свежие копии базы данных tz .Если вы не можете установить эти обновления Java или если некоторые неосторожные политики внесли изменения в зоны в последнюю минуту, вы можете вручную обновить вашу Java с помощью Timezone Updater Tool от Oracle.
Locale
Знайте, что Locale
не имеет ничего общего с часовым поясом.A Locale
определяет (а) человеческий язык, который будет использоваться для перевода, и (б) культурные нормы, решающие такие вопросы, как аббревиатура, пунктуация и порядок частей.Таким образом, вам нужно только Locale
при генерации строк, при использовании класса DateTimeFormatter
.
Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
Так что часовой пояс определяет значение значения даты и времени, ноLocale
определяет его представление .
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют неприятные старые классы даты и времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial .И найдите в Stack Overflow множество примеров и объяснений.
Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать… ).
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.