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

3
我有一个时区名称作为输入,例如 'Europe/Istanbul' 作为字符串。
如何获取当前时间偏移量与GMT的差值(基于当前时间),即输出 +2
PS,如果需要,我正在使用DateTime::TimeZone

3
你不能直接获取与格林威治标准时间的偏移量,你只能在特定时间获得它。 - ysth
为什么!格林威治标准时间偏移量会随着时间参数的传递而时刻变化?! - Ashraf Bashir
2
在我的时区,偏移量根据一年中的时间而定,要么是-4,要么是-5。 - AKHolland
那么假设我想根据当前时刻获取它,即现在。这该怎么做? - Ashraf Bashir
2个回答

8
你可以使用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
或者只需 my $offset=DateTime->now(time_zone=>$tzName)->offset - ysth
偏移量可能会根据日期时间而变化(主要是因为夏令时)。更新答案以明确这一点。 - ikegami
我认为假设每6个月就会改变是不正确的。例如,可以查看像埃及这样的国家白天如何变化:http://www.timeanddate.com/time/change/egypt/cairo - Ashraf Bashir

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接