2014-10-11 6 views
0

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

Запоминание как UTC, как DATETIME в MySQL представляет проблему, если Боб создал задание на 1am 20 февраля, а затем Джейн в Калифорнии будет увидеть задачу из-за 19 февраля

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

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

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

+0

уточнить; вы хотите, чтобы все, независимо от их часового пояса, увидели, что их задача должна быть выполнена 20-го в их собственной временной зоне, а не в часовой пояс человека, который создал эту задачу? Пример использования может быть заполнением опроса, где смешно просить Джейн завершить его в середине ночи и 24-часовое окно, когда каждый может это сделать, не имеет значения? – Ben

+0

Да, я хочу, чтобы все, независимо от их часового пояса, увидели, что что-то должно сказать понедельник 13 октября в своем календаре. – user1941747

ответ

0

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

$timestamp=1413027859; 
$timezone='Australia/Sydney'; 
$dt=new DateTime(); 
$dt->setTimestamp($timestamp); 
$dt->setTimezone(new DateTimeZone($timezone)); 
$day=$dt->format('Y-m-d'); 
+0

Значит, вы бы использовали два столбца в MySQL для хранения данных? DATETIME/TIMESTAMP и «часовой пояс пользователя» VARCHAR (?) – user1941747

+0

Лично я никогда не использую типы DATETIME в базах данных, потому что они никогда не работают так, как я ожидаю, и (иногда неявно) различны для каждого аромата SQL , Итак, если часовой пояс не имеет значения, я просто храню временную метку unix (например, на время, когда произошло определенное событие). Если временной интервал имеет значение, я сохраняю его либо в отдельном поле рядом с меткой времени, либо косвенно, например. имея внешний ключ к таблице Person, в которой хранится часовой пояс для лиц. –

2

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

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