Задать вопрос
region23
@region23
веб-разработчик

В какой TimeZone хранить DateTime в БД?

Веб-приложением будут пользоваться в разных часовых поясах.
В каком формате (часовой пояс) хранить поле с датой и временем в БД?

Как определять часовой пояс у клиента?
Я вижу 2 варианта:
1. Хранить в UTC, время определять на основании IP-адреса клиента.
2. Хранить в UTC, часовой пояс клиент выставляет руками в профиле.

Интересно, как хранят время в Facebook и Вконтакте?

Поделитесь своими практиками и идеями?
Может быть есть Best Practice?
  • Вопрос задан
  • 5673 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 1
DeusModus
@DeusModus
Храните по гринвичу или москве — это не важно. Вам важно знать смещение у каждого пользователя.
Вот как это сделать:
var d = new Date()
var gmtHours = -d.getTimezoneOffset()/60;
console.log("The local time zone is: GMT " + gmtHours);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
alekciy
@alekciy
Вёбных дел мастер
Храните в unix timestamp. При этом даже если на сервере будет неактуальная/поврежденная tzdata база (злоключения данной базы я думаю помним все), то данные в базу уйдут корректными. Если же привязываться к зонам, то всегда есть шанс, что формирование даты будет выполнено некорректно и некорректно же запишется в базу.
Ответ написан
helions8
@helions8
Хранить в UTC, при регистрации/первом входе подставлять TZ клиента по IP, далее использовать сохраненный.
Ответ написан
taliban
@taliban
php программист
Не знаю как другие, но контакт хранит (и высчитывает) даты по своему (моссковскому?) времени, это заметно при действиях с датами (вычитание, сложение итд) Если каждый будет хранить по своему, это может быть чревато, выберите один формат и потом приводите его к пользовательскому (по айпи или профилю не важно, а помжно и так и так)
Ответ написан
>Не нужно хранить сопоставления на сервере.

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

Мне видится оптимальным хранить в timestamp/UTC, пояс пользователя в профиле/куках, а при несовпадении с сохраненным определенного локально JS спрашивать «У вас в настройках сайта часовой пояс +4, а в настройках вашего компа +12. Скорректировать настройки сайта в соответствии с локальными?»
Ответ написан
Fastto
@Fastto
а можно не заморачиваться и при инициализации с БД устанавливать текущий часовой пояс клиента.
т.е. заходит чел с часовым поясом +4, ты SET TIME_ZONE = '+04:00' в БД сразу после создания соединения делаешь и работаешь без единой мысли о всяких конверсиях,
в итоге каждый согласно своим настройкам работает в своем часовом поясе.

проблема с неавторизованными — ну тут помогает предыдущий комментатор.
изначально устанавливаешь дефолтный серверный пояс, по загрузке JS корректирует его локальным пользовательским и храним в куках до авторизации/регистрации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы