svisch
@svisch

Как работает timezone в php и postgres?

Добрый вечер. Запутался совсем со временем и датой с учетом временных зон.
Допустим, сервер у меня в зоне +3 (Москва)
Настройки веб сервера и бд выставлены тоже на эту временную зону.
Предположим, пользователь системы заходит из Владивостока, выставляет в каком-нибудь инпуте дату относительно его зоны и записывает данные в базу.
Дальше, в моем представлении, возможны варианты в зависимости от того какой тип данных в бд (с учетом timezone или без). Но ни в том ни в другом случае я не понимаю как пользователю отличному от временной зоны сервера будет отражаться его время? Ведь он делает запрос к серверу относительно него работает скрипт и учитывается временная зона сервера.
Надеюсь понятно объяснил проблему. Буду благодарен за пояснения)
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
@galaxy
Ну для начала пользователь из Владивостока должен как-то сообщить серверу о своей зоне (например, выставив ее в настройках своего профиля).
Далее, PHP должно распарсить строку с датой (например, с помощью DateTime::createFromFormat), причем использовать зону, настроенную пользователем. Полученную дату (объект DateTime) можно вывести пользователю дату/время в любой временной зоне, сделав DateTime::setTimezone() и DateTime::format().

БД работает похожим образом: если используется тип TIMESTAMP WITH TIMEZONE, то физически в колонке хранится время в UTC. Клиент (в данном случае приложение PHP) при подключении к БД задает желаемую зону (или не задает, тогда используется зона по умолчанию из настроек сервера БД). В этой зоне клиенту выдаются даты. При желании поле с меткой времени можно перевести в другую зону через констукцию datetime_value AT TIME ZONE zone.

По идее, БД и PHP у вас используют одну, общую для сервера, зону, и менять это обычно смысла нет. Ваша задача - правильно распарсить даты, присылаемые пользователем (подставив его предпочитаемую зону), а также выводить даты пользователю в его зоне. Проще всего один раз выставить эту зону через date_default_timezone_set()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
У браузера есть доступ к локальной таймзоне. Следовательно, все даты, находящиеся на сайте, он способен прозрачно отобразить с нужным часовым поясом.

А давать пользователям рулить тем, что они записывают в базу, не стоит - всегда лучше подпереть самостоятельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы