2014-09-05 2 views
0

Я работаю над приложением PHP (CodeIgniter)/MySQL, которое позволяет пользователям выбирать, когда будет опубликовано их сообщение в блоге. Как я разработал его для работы до сих пор:Сохранение определенных значений даты и времени для пользователей в разных часовых поясах

  1. Пользователь задает часовой пояс в своем профиле.
  2. Пользователь устанавливает дату публикации публикации в блоге. Предполагается, что эта дата/время основывается на часовом поясе пользователя.
  3. Основанный на часовом поясе пользователя дата публикации конвертируется в UTC (00:00).
  4. Преобразованная дата хранится как DATETIME в mysql.
  5. Сервер часто преобразует сохраненные значения DATETIME в часовой пояс сервера и публикует контент, когда наступает их время.

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

+2

хранить все как utc и конвертировать по мере необходимости, когда приходит время его отображения. –

+0

@MarcB - Это то, что он сказал, что он делает (по крайней мере, для пунктов 1-4). Но ключ находится в первом предложении: «* будет опубликован» (будущее время) –

+0

@matt: сохраняется. принять любую дату, которую пользователь предоставляет, но предположим, что это их местный часовой пояс, а затем конвертировать в utc при хранении.если этот язык не изменит свои правила часового пояса между датой публикации и датой публикации, то дата utc все равно будет такой же. –

ответ

1

Так вы говорите о расписании будущего время хранения только UTC не обязательно лучший подход.

Имейте в виду, что правила часового пояса могут (и делать) изменять. Если вы примените обновление к данным своего часового пояса (в PHP это делается с пакетом PECL timezonedb), то любые данные, которые вы уже конвертировали в UTC, могут быть недействительными.

Лучшее решение для хранения нескольких значений:

  • оригинальный местное время и дату

  • Оригинальный часовой пояс (например, "America/New_York".)

  • Дата и время UTC , преобразованные из местных значений

Если вы хотите посмотреть, пришло ли время для запуска задачи, вы сравниваете текущую дату и время UTC с сохраненным значением UTC.

Когда вы применяете обновления часовых поясов, вы выбрасываете предыдущие значения UTC для всех будущих записей и пересчитываете новые на основе обновленных данных.

Если вы этого не сделаете, вы теряете намерение, которое пользователь первоначально предоставил. И если вы не будете обновлять данные своего часового пояса, ваша система не будет знать о различных изменениях, происходящих во всем мире, таких как изменения, произошедшие в Египте в начале этого года, или изменения, произошедшие в октябре для России.

Последняя точка - если она выполнена правильно, часовой пояс вашего сервера не должен иметь значения. Сравните UTC с UTC.

+0

Как я узнаю, произойдет ли изменение правил часового пояса? –

+1

Данные берутся в [IANA] (http://www.iana.org/time-zones). Вы можете подписаться на их список рассылки объявлений. Но PHP не * самообновляется. Чтобы получить новые данные, вам нужно либо обновить PHP, либо напрямую использовать пакет PECL. См. [Этот вопрос и его ответы] (http://stackoverflow.com/questions/3564478/how-to-update-timezonedb-in-php-updating-timezones-info). –

+0

@MattJohnson Кажется, что Postgres рекомендует не хранить часовой пояс с момента времени (https://www.postgresql.org/docs/9.4/static/datatype-datetime.html#DATATYPE-TIMEZONES). Есть предположения? – geoboy

Смежные вопросы