Странные mysql beahviours с часовыми поясами?Как их контролировать? - PullRequest
0 голосов
/ 11 апреля 2011

Я написал веб-приложение, используя Spring + Hibernate. Я разработал все для Windows, а затем перенес это на виртуальный сервер Linux (итальянский поставщик Aruba). Я заметил раздражающую вещь: когда даты, когда они сохранены на окнах, будут такими же, как у моих «настенных часов», поэтому, если я прочту 13:45, у меня будет тот же час в строке mysql. Такого в Linux не бывает. На самом деле машина linux также находится на CEST (мой часовой пояс), я набрал «date» в оболочке. Но я получаю даты, сохраненные в БД, со смещением относительно GMT. Опять же, мое приложение всегда отображает все в формате GMT ​​(включая GMT в качестве часового пояса, если я решу отформатировать даты для отображения часового пояса), и MySQL сохраняет все в этом формате. Как мне все это контролировать?

1 Ответ

0 голосов
/ 11 апреля 2011

Я публикую решение самостоятельно, потому что думаю, что оно стоит на этом сайте.

Прежде всего: mySql не хранит информацию о часовом поясе. Итак, скажем, что вы работаете в GMT + 4, и вы пишете пару записей, которые содержат поля даты. Затем вы перемещаете свою систему в GMT-2, читаете эти записи (возможно, импортируете данные из mysqldump). Если ваша система и виртуальная машина имеют часовой пояс GMT-2, прочитанные вами даты будут считаться такими, как если бы они были записаны в GMT-2 и НЕ РЕГУЛИРОВАНЫ.

Решение: Возьмите под свой контроль часовой пояс виртуальной машины , используя параметр командной строки -Duser.timezone="GMT" (вы даже можете поместить это в свой скрипт запуска Tomcat) или предпочитаемый часовой пояс (но GMT лучше, позвольте мне объяснить Зачем). Таким образом, вы точно будете знать , в каком часовом поясе работает ваша виртуальная машина. Это не означает, что Java VM будет предполагать, что ваше системное время соответствует времени, указанному в вашем user.timezone , оно будет знать системный часовой пояс и соответственно корректировать даты. На самом деле, если вы не в Гринвиче, вы увидите даты с корректировкой по Гринвичу и соответственно сохранены в БД. Таким образом, вы будете уверены, что используете это в качестве ссылки.

Проблема в том, что если вы берете объект даты и делаете myDateObject.toString(), вы получите дату, скорректированную по Гринвичу, со смещением часов. Что не то, что вы, вероятно, захотите.

Решение состоит в том, чтобы использовать SimpleDateFormat и делать что-то подобное, когда вам нужно вывести дату:

 SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm   dd/MM/yyyy z", Locale.ITALY);

        dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Rome"));

Все будет обращено правильно. Вы даже можете пойти дальше, если разрабатываете веб-приложение. Вы можете извлечь часовой пояс из HttpRequest и соответствующим образом настроить вывод даты, но я не зашел так далеко, как пишу приложение, предназначенное только для итальянских пользователей: D (yay).

Надеюсь, это поможет.

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