Потерянный в датах и ​​часовых поясах - PullRequest
1 голос
/ 05 июня 2010

Я работаю над приложением, в котором хранятся конференции с указанием даты их начала и окончания. До сих пор я работал в Бельгии, а мой сервер во Франции, поэтому все в одном часовом поясе, никаких проблем. Но сегодня я в Сан-Франциско, мой сервер находится во Франции, и я заметил, что у меня ошибка.

Я устанавливаю даты из клиента Flex (ActionScript автоматически настраивает отображение даты в соответствии с локальным часовым поясом клиента, для меня сегодня GMT-8. Мой сервер работает на Hibernate и MySQL во Франции (GMT + 1). Я просматриваю свою базу данных с помощью phpMyAdmin, вижу дату, установленную на «2010-06-07 00:00:01», но в моем клиенте Flex отображается «2010-06-06 15:00:01».

В конечном счете, я хочу, чтобы даты отображались в местном часовом поясе события, то есть в дате, которую я установил. Поэтому, когда я нахожусь в Бельгии, и я установил дату начала события «2010-06-07 00:00:01», я хочу получить его таким образом.

Но я заблудился относительно того, что слой адаптируется к чему. Хранится ли часовой пояс в столбцах DATETIME MySQL (я не вижу его в MySQL)? Относится ли Hibernate к чему-либо, когда он передает его на java.lang.Date, в котором есть информация о часовом поясе? И в конечном итоге, как лучше всего решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 05 июня 2010

Я предлагаю вам хранить и использовать все время в GMT, т.е. GMT + 0. Именно так системные часы используются во многих системах.

Только когда вы отображаете время, вам нужно преобразовать время в местный часовой пояс, что вам нужно сделать только в графическом интерфейсе. Это позволяет вашим часовым поясам оставаться свободными.

2 голосов
/ 05 июня 2010

Это действительно беспорядок. Я уже писал что-то об этом.

В вашем случае я бы посоветовал: каждая конференция имеет (концептуально) время начала типа "ЛОКАЛЬНАЯ ДАТАЙМ", а также имеет часовой пояс (часовой пояс может быть либо неявным по своему расположению, либо сохранен явно по другим данным). Это концептуально правильно: если пользователь говорит: «Конференция начинается в 11:00 утра ", он имеет в виду" в тот момент, когда часы это тот город отмечает 11:00 утра "(даже если завтра правительство решит изменить смещение страны по Гринвичу). Это также относительно просто реализовать, так как Java и Mysql не очень умны в часовые пояса. Просто придерживайтесь (в вашем сценарии = к этой интерпретации: даты и время для конференций являются ЛОКАЛЬНЫМИ, они не представляют момент времени на линии физического континуума времени, но представляют собой гражданскую концепцию. Недостатком, конечно, является то, что будет труднее делать вычисления времени, особенно внутри БД.

Вам нужно будет только преобразовать его в «физическое время», если вам нужно вычислить, например, интервал с этого момента до этого события (если вам нужно поднять тревогу или отличить события в прошлом от событий в будущем и тд). Потому что «сейчас» - это концепция физического времени. В этом случае вы должны сделать преобразование самостоятельно. Если вам нужно выполнить этот расчет внутри БД, вам, вероятно, придется явно сохранять смещение GMT ​​(например, в минутах) в БД.

0 голосов
/ 05 июня 2010

Я нашел проблему. MySQL DATETIME не хранит никакой информации о часовом поясе, но java.util.Date делает. Поэтому, когда Date был отправлен моему клиенту Flex через канал AMF, Actionscript применил смещение часового пояса. Я решил проблему, заменив поля с типом Date целыми числами (дата, месяц, год) и перестроив ActionScript Dates на стороне клиента при необходимости.

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