2010-06-06 17 views
2

У меня есть приложение, которое в настоящее время хранит метки времени в значениях 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) 

Есть что-нибудь, что я здесь отсутствует, или у кого-нибудь есть лучшие предложения для подхода?

ответ

1

Есть ли что-то, что мне не хватает здесь, или у кого-нибудь есть лучшие предложения для подхода?

Возможно, вы слишком много работаете.

Пока вы знаете часовой пояс сохраненной метки времени, вы можете легко преобразовать его в другой часовой пояс. Если вы используете современную версию PHP, встроенный DateTime class включает в себя всестороннее управление часовым поясом.

Вам не обязательно нужны преобразовать все часовой пояс в базе данных если они уже рассматривали местное время, и это было правильно настроены для использования локального часового пояса, то есть они уже самосогласованные , Все, что вам нужно сделать, это просто преобразовать локальные времена в часовой пояс пользователя при рендеринге времени для них и сохранить записанный часовой пояс с отметкой времени (для других пользователей, просматривающих время в часовом поясе владельца метки времени).

В противном случае ваш план выглядит хорошо продуманным и полным.

+0

Значения datetime согласованы прямо сейчас, но когда я переношу серверы, мне нужно будет установить сервер в том же часовом поясе, что и сейчас, даже если он на самом деле находится где-то в другом месте (я планирую перейти на Amazon's Сингапур, теперь, когда он работает и работает). Если я покину сервер, установленный в его реальном часовом поясе, значение NOW() изменится, так что будет существовать несогласованность между отметками времени, тогда как TIMESTAMP_UTC() всегда будет одинаковым –

+0

В противном случае да, PHP 5.2 w/DateTime класс делает вещи намного проще, чем они были раньше :) Это будет часть уровня приложения. –

+0

Переключатель часового пояса ожидающего сервера (особенно, если вы не контролируете сервер) является очень хорошей причиной для перехода на UTC. – Charles