Конвертировать идентификатор часового пояса Олсона в GMT +/- X - PullRequest
1 голос
/ 13 февраля 2012

Я сохраняю временные метки эпохи, а временные зоны посетителей сохраняются в качестве идентификатора Олсона, например, Европа / Лондон

 if($userTz && $userTz ne "Europe/London"){
    $ENV{TZ} = "$userTz";
 }

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
...

Когда эпоха отображается в соответствующем часовом поясе, который я хочу разместить после даты / временичасовой пояс есть.Пример GMT + 4 вместо Asia / Muscat (используя пример GMT + 4)

1 Ответ

3 голосов
/ 13 февраля 2012

Вам необходимо DateTime / DateTime :: TimeZone .

Смещение в секундах (см. Также связанные методы offset_as_seconds и offset_as_string ):

DateTime::TimeZone->new(name => 'Asia/Muscat')->offset_for_datetime(DateTime->now)
# 14400

Спецификатор ISO 8601 / RFC 3339

DateTime->now(time_zone => 'Asia/Muscat')->strftime('%z')
# '+0400'

GMT ± X нестандартно, не ожидайтелюбая система или программное обеспечение для взаимодействия с этой нотацией.Как вы выражаете в этой схеме зоны, которые не являются смещениями на целый час, например Азия / Тегеран?В любом случае текущая система основана на UTC: http://enwp.org/UTC%2B04:00. Наивная реализация может искажать одно из значений, приведенных выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...