Как установить часовой пояс в PHP

У меня есть сайт со списком магазинов в разных странах (разные часовые пояса), и он должен отображать, когда магазин ОТКРЫТ или ЗАКРЫТ по рабочим часам.

У меня есть javascript, который получает смещение часового пояса по умолчанию по Гринвичу, когда летнее время не установлено, поместите его в mysql, и эта часть работает правильно.

Мой часовой пояс GMT+1 (и сейчас активен переход на летнее время, так что сейчас +1 час)

Я использую php для изменения зоны, используя это:

date_default_timezone_set('Etc/GMT+1');
echo date('h');

Время здесь: 22:00

Время по Гринвичу: 20:00

И этот код возвращается: 7 вечера

Так что это похоже на то, что вместо увеличения на 1 оно уменьшается, и плюс нет перехода на летнее время...

Может кто-нибудь сказать мне, что здесь происходит? Это ошибка php или что-то не так на сервере?

Спасибо...


person SharkTheDark    schedule 23.06.2011    source источник


Ответы (2)


Сейчас я посмеиваюсь, потому что недавно у меня была подобная проблема. К сожалению, часовые пояса Etc/GMT устарели. Они ломаются. Моя личная рекомендация? Просто используйте ЧЧ:ММ или установите его по городу (города не требуют корректировки летнего времени!)

person cwallenpoole    schedule 23.06.2011
comment
Я не могу получить город, только смещение по Гринвичу... И я не могу использовать глобальное время и увеличивать/уменьшать его по смещению, потому что это будет неправильно, потому что иногда на моем сервере установлено летнее время, а в магазинах места - нет. т, или иначе... - person SharkTheDark; 24.06.2011
comment
Etc/GMT — это глобальное время +/- смещение. Если время сохранения вашего сервера установлено неправильно, вы сможете исправить это, установив часовой пояс города. В этом случае он будет соответствующим образом компенсировать GMT. - person cwallenpoole; 24.06.2011
comment
Да, я заметил, что он изменился на +/-... Но по-прежнему нет перехода на летнее время... Могу ли я добавить для каждого города GMT+X, который будет соответствовать этому часовому поясу, и применить летнее время по этому? Будет ли это правильно? - person SharkTheDark; 24.06.2011

Возможно, в этой ситуации может помочь date('I').
Если нет возможности определить список поиска [смещение по Гринвичу] - [название часового пояса]. Тогда можно будет настроить часовой пояс с помощью классов DateTime\DateTimeZone.

person Alex Stetsenko    schedule 23.06.2011
comment
date('I') покажет, находится ли он в периоде летнего времени или нет... И это 0, как час времени, иначе будет подсчитано +1... - person SharkTheDark; 24.06.2011