Я публикую решение самостоятельно, потому что думаю, что оно стоит на этом сайте.
Прежде всего: 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).
Надеюсь, это поможет.