У меня есть приложение, которое должно хранить даты выполнения. Поэтому, если Боб в Великобритании создаст задание и скажет, что оно должно быть выполнено 20 февраля, я хочу, чтобы оно отображалось в календаре как 20 февраля независимо от часовых поясов других пользователей.
Хранение как UTC как DATETIME
в MySQL возникает проблема, заключающаяся в том, что если Боб создал задачу в 1:00 20 февраля, то Джейн в Калифорнии увидит задачу в срок 19 февраля.
Так что моя другая мысль состоит в том, чтобы сохранить его как DATE
но я не мог найти литературу о том, как DATE
зависит от TimeZone.
Итак, мой вопрос: если мое приложение — PHP, а мое хранилище — MYSQL, и я хочу реализовать календари, которые хранят только даты, а не дату / время, и я хочу, чтобы события отображались как определенная дата в глобальном масштабе, как мне это сделать?
Помимо моих особых потребностей, мне также любопытно, как другие люди реализуют события, относящиеся к конкретным датам (вы просто позволяете датам отличаться в календарях разных пользователей?) — Например, как Google Calendar / Outlook обрабатывает «события на весь день»?
Вы можете просто сохранить дату как поле DATE. Поскольку вы хотите, чтобы все пользователи видели одну и ту же дату, вам не нужно беспокоиться о часовых поясах и тому подобном. То есть хранения 2014-10-11
в столбце, а затем показывает это значение для пользователей.
Самый безопасный способ сделать это — сохранить как временную метку Unix, так и часовой пояс создателя задания. Затем при отображении даты для других пользователей используйте этот часовой пояс для отображения времени:
$timestamp=1413027859;
$timezone='Australia/Sydney';
$dt=new DateTime();
$dt->setTimestamp($timestamp);
$dt->setTimezone(new DateTimeZone($timezone));
$day=$dt->format('Y-m-d');