У меня есть имя timzeone в качестве входных данных, например, «Europe/Istanbul
» в виде строки.
Как я могу получить текущее смещение от GMT (на основе текущего времени), т. е. +2
в качестве вывода?
PS, я использую DateTime::TimeZoneесли это поможет
Преобразовать имя часового пояса в смещение часового пояса по Гринвичу в Perl?
Ответы (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
my $offset=DateTime->now(time_zone=>$tzName)->offset
- person ysth; 18.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