Как лучше хранить даты выполнения?

У меня есть приложение, которое должно хранить сроки выполнения. Поэтому, если Боб в Великобритании создает задачу и говорит, что она должна быть выполнена 20 февраля, я хочу, чтобы она отображалась как 20 февраля в календаре независимо от часовых поясов других пользователей.

Хранение его в формате UTC как DATETIME в MySQL создает проблему, заключающуюся в том, что если Боб создал задачу в час ночи 20 февраля, то Джейн в Калифорнии увидит, что задача должна быть выполнена 19 февраля.

Поэтому моя другая мысль - сохранить его как DATE, но я не смог найти никакой литературы о том, как DATE зависит от TimeZone.

Итак, мой вопрос: если мое приложение - PHP, а мое хранилище - MYSQL, и я хочу реализовать календари, в которых хранятся только даты, а не дата/время, и я хочу, чтобы события отображались как определенная дата во всем мире, как мне это сделать?

Помимо моих конкретных потребностей, мне также любопытно, как другие люди реализуют события, связанные с датой (вы просто позволяете дате быть разной в календарях разных пользователей?) - Например, как Google Calendar/Outlook обрабатывает «события на весь день»?


person user1941747    schedule 11.10.2014    source источник
comment
уточнить; Вы хотите, чтобы все, независимо от их часового пояса, видели, что их задача должна быть выполнена 20-го числа в их собственном часовом поясе, а не в часовом поясе человека, создавшего задачу? Примером использования может быть заполнение опроса, где нелепо просить Джейн заполнить его посреди ночи и 24-часового окна, когда каждый может это сделать, не имеет значения?   -  person Ben    schedule 11.10.2014
comment
Да, я хочу, чтобы все, независимо от их часового пояса, видели, что что-то должно произойти, скажем, в понедельник, 13 октября, в их календаре.   -  person user1941747    schedule 11.10.2014


Ответы (2)


Вы можете просто сохранить дату как поле DATE. Поскольку вы хотите, чтобы все пользователи видели одну и ту же дату, вам не нужно беспокоиться о часовых поясах и т.п. т.е. сохраняя 2014-10-11 в столбце, а затем показывая это значение пользователям.

person Jim    schedule 11.10.2014

Самый безопасный способ сделать это — сохранить как временную метку unix, так и часовой пояс создателя задания. Затем при отображении даты для других пользователей используйте этот часовой пояс для отображения времени:

$timestamp=1413027859;
$timezone='Australia/Sydney';
$dt=new DateTime();
$dt->setTimestamp($timestamp);
$dt->setTimezone(new DateTimeZone($timezone));
$day=$dt->format('Y-m-d');
person Roel Harbers    schedule 11.10.2014
comment
Итак, вы бы использовали два столбца в MySQL для хранения данных? DATETIME/TIMESTAMP и часовой пояс пользователя VARCHAR(?) - person user1941747; 11.10.2014
comment
Лично я никогда не использую типы DATETIME в базах данных, потому что они никогда не работают так, как я ожидаю, и (иногда слегка) отличаются для каждой разновидности SQL. Итак, если часовой пояс не имеет значения, я просто сохраняю временную метку unix (например, время, когда произошло определенное событие). Если часовой пояс имеет значение, я сохраняю его либо в отдельном поле рядом с отметкой времени, либо косвенно, например. имея внешний ключ к таблице Person, в которой хранится часовой пояс этого человека. - person Roel Harbers; 11.10.2014