2009-04-13 2 views
4

PHP, похоже, использует довольно раздражающий метод для установки часового пояса evnironment, используя имена регионов, а не GMT. Это приводит к тому, что выпадение часового пояса вызывает огромную боль, потому что оно должно быть огромным, чтобы соответствовать всем возможным значениям временного диапазона PHP, или мне нужно найти способ преобразования смещения GMT в допустимое значение для перехода к PHP.Временная зона в PHP

Итак, учитывая смещение по умолчанию GMT, как я могу установить часовой пояс в PHP? Например, как я могу преобразовать значение смещения GMT «-8.0» в значение, которое я мог бы передать в date_timezone_set()?

ответ

17

Использование названия региона - Право Способ описания часового пояса. Использование смещения GMT по своему усмотрению чрезвычайно неоднозначно.

Это отражено в вашем вопросе - как вы должны преобразовать смещение GMT ​​-8 в часовой пояс? Ну, это зависит от того, что на самом деле означает GMT -8. Это означает «UTC -8 в каждый момент времени» или это означает «UTC -8 в зимнее время и UTC -7 в летнее время»? Если это последний, когда начинается и заканчивается зима?

Я хотел бы надеяться, что PHP принял известный набор значений для «фиксированных» (без DST) часовых поясов, например. «Etc/GMT + 3» и т. Д. Но если вы действительно не имеете в виду фиксированный часовой пояс, вам лучше узнать, в каком регионе вы говорите, потому что в противном случае ваши расчеты почти наверняка будут ошибочными в какой-то момент ,

Я занимаюсь часовыми поясами большую часть прошлого года. Это боль - , в частности, когда некоторые зоны меняют свои правила для DST (как это делали США несколько лет назад) или когда некоторые зоны выбирают и выходят из DST, по-видимому, по своему усмотрению. Попытка отразить все это в одном числе - глупость. Если вас интересует только один момент времени, это может быть хорошо, но в этот момент вы можете просто сохранить значение UTC в первую очередь. В противном случае наилучшим подходом является имя. (Не обязательно просто плавать в этот момент, заметьте. Даже имена меняются со временем ...)

+0

Как PHP знает преобразования (например, с DateTimeZone :: getOffset) из одного региона в другой если региональные временные соглашения всегда меняются? – Calvin

+0

Я предполагаю, что они приходят в обновлениях PHP. Вы сохраняете свой PHP исправленный, не так ли? :-) – ceejayoz

+1

Они все еще выпускают патчи для PHP3? = P – Calvin

1

Вам необходимо будет вести базу данных с летними данными из разных мест, поэтому лучше хранить их местоположение.

5

Если вы используете PHP> = 5.2, вы можете использовать встроенный метод класса DateTimeZone, listAbbreviations.

var_dump(DateTimeZone::listAbbreviations());