remenikomer
10.02.2017 - 23:43
На DLE есть функционал поясов. Пользователи сами настраивают. Но я сделал свой модуль. Теперь опомнился о поясах.
Но понять принцип их работы никак не могу. Кучу всего перечитал, а толку ноль.
Например, есть два пользователя: 1 пользователь из Калининграда (+2), 2 пользователь из Новосибирска (+6). Сервер находится в Москве (+3).
2-й написал пост. Что в базу сохранять, какое время?
1-й - это модератор. Ему какое время выводить?
2-й читает посты. Какое время в постах выводить?
Я так понимаю, все сохраняется по времени сервера. А перед выводом нужно устанавливать таймзон из настроек юзера. Правильно?
И еще... в даты хранятся в разных форматах (разные типы записей, действий) - так надо было...
т.е. timestamp и datatime.
Соответственно, разумный, наверно, вопрос. Что делать со временем datetime - 2016-01-15 10:01:57, как их модифицировать для пользователей с учетом пояса?
Подскажите, пожалуйста, алгоритм работы скрипта, обработки данных.
AllesKlar
11.02.2017 - 00:34
Фигач по Гринвичу.
Цитата (remenikomer @ 10.02.2017 - 21:43) |
И еще... в даты хранятся в разных форматах (разные типы записей, действий) - так надо было... |
так НЕ надо было.
Поэтому
Цитата (remenikomer @ 10.02.2017 - 21:43) |
Что делать со временем datetime - 2016-01-15 10:01:57, как их модифицировать для пользователей с учетом пояса |
страдать, писать костыли и больше никогда так не делать.
_____________
[продано копирайтерам]
remenikomer
11.02.2017 - 00:46
Цитата (AllesKlar @ 11.02.2017 - 00:34) |
так НЕ надо было. |
Сначала сделал datetime, но потом переделал в timestamp некоторые поля. Некоторые оставил, т.к. выводятся для информации, действий никаких не делается с ними.
Цитата (AllesKlar @ 11.02.2017 - 00:34) |
Фигач по Гринвичу. |
Дак вопрос и звучит - как?
remenikomer
11.02.2017 - 10:44
Цитата (Миша @ 11.02.2017 - 06:24) |
TIMESTAMP |
и как это решает мой вопрос?
killer8080
11.02.2017 - 15:36
Цитата (remenikomer @ 10.02.2017 - 23:43) |
Например, есть два пользователя: 1 пользователь из Калининграда (+2), 2 пользователь из Новосибирска (+6). Сервер находится в Москве (+3). |
Неправильный подход, нельзя работать с офсетами, нужно работать с зонами в формате IANA, например для Москвы Europe/Moscow. Надеюсь не нужно объяснять почему?
Цитата (remenikomer @ 10.02.2017 - 23:43) |
2-й написал пост. Что в базу сохранять, какое время? |
Всегда UTC, для DATETIME конвертировать в PHP (gmdate()), или выставлять time_zone перед вставкой, если используешь функционал субд для работы со временем. Для TIMESTAMP со вставкой времени заморачиваться не нужно, просто now(). Этот тип всегда в UTC, вне зависимости от настроек.
Цитата (remenikomer @ 10.02.2017 - 23:43) |
1-й - это модератор. Ему какое время выводить? |
Естественно выводить время в часовом поясе юзера.
Цитата (remenikomer @ 10.02.2017 - 23:43) |
2-й читает посты. Какое время в постах выводить? |
аналогично, сделай чтоб юзеры могли в своем профиле указывать свою TZ, для анонимов если нужно через куки.
Цитата (remenikomer @ 10.02.2017 - 23:43) |
Я так понимаю, все сохраняется по времени сервера. |
Не факт, зависит от конфигурации, по умолчанию мускул использует системную зону.
Цитата (remenikomer @ 10.02.2017 - 23:43) |
А перед выводом нужно устанавливать таймзон из настроек юзера. Правильно?
|
правильно
Цитата (remenikomer @ 10.02.2017 - 23:43) |
Соответственно, разумный, наверно, вопрос. Что делать со временем datetime - 2016-01-15 10:01:57, как их модифицировать для пользователей с учетом пояса? |
Если бы ты изначально хранил DATETIME в UTC, проблем бы не было, а так придётся заморочиться с добавлением поля timestamp, и копированием туда времени из datetime поля.
Главный вопрос, насколько сильно всё запущено
Цитата (remenikomer @ 10.02.2017 - 23:43) |
Сервер находится в Москве (+3). |
С какого периода записи в БД? Уточняй и смотри какие переходы были в этот период. Если даты до 2012 года (не помню точных дат), то придётся парится с DST, с 2012 по 2014 в Москве был пояс +4, с 2014 +3. В общем чем древнее даты тем больше костылей
PS тут не давно был
холиварчик по работе со временем