在Perl中将时区名称转换为GMT时区偏移量?

时间:2015-02-18 14:55:44

标签: perl timezone timezone-offset

我有一个timzeone名称作为输入,例如'Europe/Istanbul'作为字符串。
如何从GMT获得当前偏移量(基于当前时间),即+2作为输出?
PS,我使用DateTime::TimeZone如果这可能有帮助

2 个答案:

答案 0 :(得分:7)

您可以使用DateTime :: TimeZone的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

答案 1 :(得分:1)

可以使用以下方法获得偏移:

$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