У меня есть приложение, которое в настоящее время хранит метки времени в значениях MySQL DATETIME и TIMESTAMP. Тем не менее, приложение должно иметь возможность принимать данные от пользователей в нескольких часовых поясах и показывать временные метки в часовом поясе других пользователей. Таким образом, я планирую внести изменения в приложение; Я был бы признателен за любые предложения по улучшению подхода.Перемещение часового пояса PHP/MySQL
модификации базы данных
- Все временные метки будут преобразованы в значения DATETIME; это обеспечить согласованность подхода и избежать того, чтобы MySQL старался делать умные вещи и преобразовывать часовые пояса (я хочу сохранить преобразование в PHP, поскольку оно включает в себя меньшую модификацию приложения и будет более переносимым, когда мне в конечном итоге удастся выход из MySQL).
- Все значения DATETIME будут скорректированы, чтобы преобразовать их в времени UTC (в настоящее время все в австралийском EST)
Запрос МОДИФИКАЦИИ
- Все использование NOW(), чтобы заменить UTC_TIMESTAMP() в запросы, триггеры, функции и т.д.
модификации Применение
- Приложение должно сохранять часовой пояс и формат предпочтительной даты (например, США против остального мира)
- Все временные метки будут преобразованы в соответствии с настройками пользователя перед отображением
- Все входные временные метки будут преобразованы в UTC в соответствии с настройками пользователя перед вводом
Дополнительная примечания
- Преобразование форматов будет осуществляться на уровне приложений по нескольким основным причинам
- The A pproach для преобразования часовых поясов варьируется от БД к БД, поэтому его передача будет не переносной (и я действительно надеюсь, что уйду от MySQL некоторое время в недалеком будущем).
- MySQL Timestamps имеет ограниченные диапазоны для разрешенных дат (~ 1970 до ~ 2038)
- MySQL Timestamps других нежелательных атрибутов, включая поведение причудливого автообновления (если не обязательно отключены) и чувствительность к настройкам зоны сервера (и Я подозреваю, что смогу испортить их, когда в этом году я перееду на Амазонку).
- Выбор изменить все текущие значения даты и времени, а также использовать UTC_TIMESTAMP() вместо NOW(), чтобы избежать каких-либо проблем с настройками часовых поясов сервера/соединения, которые будут изменять NOW(), но оставить UTC_TIMESTAMP() один; см. ниже пример.
Пример UTC_TIMESTAMP() против NOW()
mysql> set time_zone = 'Australia/Canberra';
Query OK, 0 rows affected (0.06 sec)
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now() | utc_timestamp() |
+---------------------+---------------------+
| 2010-06-06 14:31:36 | 2010-06-06 04:31:36 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = 'America/Los_Angeles';
Query OK, 0 rows affected (0.00 sec)
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now() | utc_timestamp() |
+---------------------+---------------------+
| 2010-06-05 21:31:43 | 2010-06-06 04:31:43 |
+---------------------+---------------------+
1 row in set (0.00 sec)
Есть что-нибудь, что я здесь отсутствует, или у кого-нибудь есть лучшие предложения для подхода?
Значения datetime согласованы прямо сейчас, но когда я переношу серверы, мне нужно будет установить сервер в том же часовом поясе, что и сейчас, даже если он на самом деле находится где-то в другом месте (я планирую перейти на Amazon's Сингапур, теперь, когда он работает и работает). Если я покину сервер, установленный в его реальном часовом поясе, значение NOW() изменится, так что будет существовать несогласованность между отметками времени, тогда как TIMESTAMP_UTC() всегда будет одинаковым –
В противном случае да, PHP 5.2 w/DateTime класс делает вещи намного проще, чем они были раньше :) Это будет часть уровня приложения. –
Переключатель часового пояса ожидающего сервера (особенно, если вы не контролируете сервер) является очень хорошей причиной для перехода на UTC. – Charles