Преобразовать имя часового пояса в смещение часового пояса по Гринвичу в Perl?

У меня есть имя timzeone в качестве входных данных, например, «Europe/Istanbul» в виде строки.
Как я могу получить текущее смещение от GMT (на основе текущего времени), т. е. +2 в качестве вывода?
PS, я использую DateTime::TimeZoneесли это поможет


person Ashraf Bashir    schedule 18.02.2015    source источник
comment
ты не можешь; вы можете получить смещение от GMT только в определенное время   -  person ysth    schedule 18.02.2015
comment
Как так ! будет ли смещение от GMT меняться от момента к моменту (на основе переданного параметра времени)?!   -  person Ashraf Bashir    schedule 18.02.2015
comment
В моем часовом поясе смещение равно -4 или -5 в зависимости от времени года.   -  person AKHolland    schedule 18.02.2015
comment
Итак, давайте предположим, что я хочу получить его на основе текущего момента, то есть сейчас. Как это может быть сделано ?   -  person Ashraf Bashir    schedule 18.02.2015


Ответы (2)


Вы можете получить текущее смещение, используя метод offset_for_datetime или метод DateTime offset. Объект DateTime требуется, поскольку смещение может варьироваться в зависимости от даты и времени (в основном из-за перехода на летнее время).

my $tz_name = 'Europe/Istanbul';

my $dt = DateTime->now( time_zone => $tz_name );
for (1..2) {
    my $offset = $dt->offset;
    printf("Offset for %s in %s is %+g\n", $dt->iso8601, $tz_name, $offset / 60 / 60);
    $dt->add( months => 6 );
}

Выход:

Offset for 2015-02-18T18:20:30 in Europe/Istanbul is +2
Offset for 2015-08-18T18:20:30 in Europe/Istanbul is +3
person AKHolland    schedule 18.02.2015
comment
или просто my $offset=DateTime->now(time_zone=>$tzName)->offset - person ysth; 18.02.2015
comment
Смещение может варьироваться в зависимости от даты и времени (в основном из-за перехода на летнее время). Обновите ответ, чтобы прояснить это - person ikegami; 18.02.2015
comment
Я думаю, что предполагать, что он меняется каждые 6 месяцев, неверно. Посмотрите, например, как меняется дневной свет в такой стране, как Египет: timeanddate.com/time/change /египет/каир - person Ashraf Bashir; 19.02.2015

Смещение можно получить, используя следующее:

$dt->offset

Смещение даты-времени может варьироваться в зависимости от времени данных (в основном из-за перехода на летнее время). Таким образом, смещение полезно только при использовании в сочетании с конкретной датой и временем, для которого оно было получено. Это означает, что существует очень мало законных способов использования смещения, кроме как для форматирования даты и времени для связи. Для этой цели вам может оказаться более полезной переменная %z strftime.

$ perl -MDateTime -E'
   say DateTime->now( time_zone => "local" )->strftime("%Y-%m-%dT%H:%M:%S%z")
'
2015-02-18T10:52:40-0800
person ikegami    schedule 18.02.2015