Как правильно перевести время на сайте?

В связи с переводом времени в России возникла необходимость перевести и время на сайте. На сервере время переведено, стандартная функция php выводит время правильно, а вот на самом сайте, к примеру, в дате публикации топика время устанавливается на час вперед. Кстати, на этом сайте ровно тоже самое. Как исправить не меняя часовой пояс в конфиге?
UP: К примеру если посмотреть тайтл даты публикации этого топика, то покажет: «29 октября 2014, 17:52», а публиковал я его в 16:52

22 комментария

avatar
Надо же, наконец-то кто-то кроме Табуна это заметил.

Судя по тому, что разработчики LiveStreet поленились использовать базу tzdata, нужно писать хитрый скрипт, который переведёт часовые пояса в базе данных на час назад тем, кому надо переводить, и не переведёт (Самаре, например). Однако, учитывая способ хранения часового пояса и то, что наверняка не все пользователи указали в профиле город, боюсь, будут большие проблемы.

Впрочем, можно и отнять единичку у всех из user.user_settings_timezone в БД примерно таким запросом:
update user set user_settings_timezone = user_settings_timezone - 1
            where user_settings_timezone is not null;
Однако это чревато всё теми же проблемами с теми, кому часовые пояса переводить так не надо.

А ещё нужно будет обновить этот список часовых поясов для отображения в настройках. Разработчики очень безответственно себя повели, не позаботившись об этом заранее. Впрочем, неудивительно: если они закрывают глаза даже на то, что абсолютно каждый сайт на livestreet сейчас решето, то реакции на смену часовых поясов от них тем более не дождёшься.
avatar
Если можно, напишите мне по поводу «решета» в личку, буду вам очень признателен.
По поводу времени, у меня на сервере оно тоже неправильно отображалось, помогли вот такие команды:
apt-get update
apt-get upgrade
avatar
Обновление времени на сервере — как раз причина того, что сбилось время на Livestreet. В системе часовые пояса сдвинулись на час назад, а в Livestreet их никто не сдвигал; в результате, когда сервер согласно tzdata живёт по UTC+3, Livestreet не использует tzdata и (для пользователей с часовым поясом Москвы) продолжает жить по UTC+4 и, видя эту разницу, как раз и добавляет проблемный час. То же самое касается отличных от Москвы часовых поясов. Стоит заметить, что тем, кто не трогал в настройках часовой пояс, возможно, повезло: в базе данных может быть значение NULL, и Livestreet возьмёт системный часовой пояс и будет считать пользователя живущим в Калининграде или Минске (для часового пояса Москвы). По крайней мере у меня на тестовом сайте оказалось именно так.
avatar
Насколько я понял по статьям на хабре, tzdata не сразу дописали правильное время для Москвы, и нужно было вручную компилировать пакеты habrahabr.ru/post/240937/, но сейчас пакет обновили, и уже все работает. (это я к тому, что может администрация ls все еще не сделала апдейт своего серверного дистрибутива?)
avatar
Появившееся смещение на час — как раз признак того, что обновление tzdata с правильными часовыми поясами прошло успешно, как это происходит — расписал комментарием выше. Дополнительным подтверждением является то, что HTTP-заголовок Date вернул мне сейчас «29 Oct 2014 18:55:07 GMT» — то есть сам сервер действительно обновил tzdata и перешёл на UTC+3.

(P.S. про решето не напишу, ибо не довреяю)
avatar
Впрочем, можно и отнять единичку у всех из user.user_settings_timezone
Конечно так нельзя делать.
avatar
Собственно, об этом я чуть ниже и написал. А по-другому никак.
avatar
У меня когда-то на сайте была обратная проблема — час в другую сторону, проблема решилась обновлением файла time_zone.tpl (не ручаюсь за правильное название), может его как-то переписать, но никак не могу сообразить, что в нём поменять, тем более, что и количество зон в России поменялось. В общем глупость какая-то.
avatar
Переписать-то названия часовых поясов (и сами часовые пояса в ActionSettings.class.php) можно (и нужно), однако это не изменит того, что Москва и Самара были для ls одним и тем же часовым поясом, и теперь автоматически разделить их технически невозможно. Остаётся только предлагать пользователям поменять часовой пояс вручную в настройках.

И пока ls не станет использовать tzdata, данная проблема будет возникать каждый раз при смене часовых поясов.(А ещё он глючит при переходе с летнего времени на зимнее, но это совсем другая история.)
avatar
Возвращаясь к нашим баранам…
Переписать-то названия часовых поясов (и сами часовые пояса в ActionSettings.class.php)
А как переписать-то? Что-то ни один из обсуждаемых вариантов не срабатывает.
В action такой код:
$aTimezoneList=array('-12','-11','-10','-9.5','-9','-8','-7','-6','-5','-4.5','-4','-3.5','-3','-2','-1','0','1','2','3','3.5','4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5','10','10.5','11','11.5','12','12.75','13','14');

Разве надо тут что-то переписывать? На мой взгляд всё верно, массив сопоставляется с тестовыми переменными. Видимо правильно сделать так: Переписать текстовые переменные, грубо говоря в Минск и Калининград добавить Москву. И для всех у кого была 4-я временная зона в базе установить третью? А Самару потом вручную подправить?
avatar
Типа того. Но это по идее всё ещё неправильно. Но более хорошего варианта я не вижу.
avatar
в конфиге есть строка отвечающая за время.
ищем строку
date_default_timezone_set('Europe/Moscom');

и меняем москву на нужный вам город из php.net/manual/en/timezones.europe.php
avatar
Это сработает, но не очень правильно, во-первых потому, что костыльно, во-вторых потому, что количество зон в России изменилось.
avatar
Нет, кстати, я вспомнил, что это никоим образом не поможет, т.к. те у кого в настройках профиля стоит москва так и будут публиковаться по Москве.
avatar
Ну это как вариант для тех у кого нет пункта городов в профиле.
Второй вариант это перевод времени на самом сервере.
Ну и третий это какой-то апгрейд от разработчиков, чего пока нет.
Так что на безрыбье, два варианта это очень не плохо.
avatar
Спасибо за отзывчивость, но вы видимо не очень вникли или не внимательно прочитали. Решение только такое:
1. Отредактировать текстовые переменные time_zone: Москву, СПб перенести в зону 3.
2. В базе всех юзеров с зоной 4 проапдейтить до зоны 3.
3. Пользователям из Ижевска и Саратова предложить вручную поменять временную зону.
avatar
Вот, кстати, статья появилась с подробным описанием проблемы часовых поясов: habrahabr.ru/company/mailru/blog/242615/
Ориентирована, правда, на Python, но сама суть проблемы от языка не зависит
avatar
А ежели )) просто вернуть все обратно?
avatar
Вы дали ссылку на запрещенный ресурс. За вами уже выехали.
avatar
Расскажите, что там? )) Обратно это куда?
avatar
Не поможет — пункты в списке исправятся, а у пользователей время так и останется сбитым.
avatar
И всё время все про Ижевск и др. забывают. ))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.