Ява время на час позади - PullRequest
5 голосов
/ 04 мая 2011

У меня есть приложение, которое сильно зависит от Java.Мы ведем обширную регистрацию, вставку базы данных и т. Д. После переключения дневного света мы заметили, что все время Java отстает примерно на час.У нас есть Jre версия 1.6_18.Я думал, что эта проблема была решена в более ранних версиях Java.Предложите, что можно сделать, если для этого есть какие-либо исправления.

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Информация о часовом поясе периодически изменяется. В обновлении 18 для Java 6 могут быть устаревшие настройки DST для вашего местоположения.

Либо обновите до последней версии ( обновление 25 ), либо запустите инструмент TZupdater .

РЕДАКТИРОВАТЬ: Я только что обнаружил, что Oracle предоставляет RSS-канал для обновления часовых поясов . Если ваше приложение обязательно должно иметь самые последние данные TZ, следите за этим.

2 голосов
/ 28 августа 2016

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 и другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...