【问题标题】:Convert timezone name to GMT timezone offset, in Perl?在 Perl 中将时区名称转换为 GMT 时区偏移量?
【发布时间】:2015-02-18 14:55:44
【问题描述】:

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

【问题讨论】:

  • 你不能;您只能从 GMT 在特定时间获取偏移量
  • 怎么会!与 GMT 的偏移量是否会随时变化(基于传递的时间参数)?!
  • 在我的时区,偏移量是 -4 或 -5,具体取决于一年中的时间。
  • 所以假设我想根据当前时刻(即现在)获取它。如何做到这一点?

标签: perl timezone timezone-offset


【解决方案1】:

您可以使用 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

【讨论】:

  • 或只是my $offset=DateTime->now(time_zone=>$tzName)->offset
  • 偏移量可能因日期时间而异(主要是因为夏令时)。更新答案以明确说明
  • 我认为假设它每 6 个月更改一次是不正确的。例如,检查像埃及这样的国家/地区的日光变化:timeanddate.com/time/change/egypt/cairo
【解决方案2】:

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

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多