将ISO-8601时间戳从UTC-7:00转换为“欧洲/阿姆斯特丹”(CEST)时间,即UTC + 2:00

时间:2016-08-10 08:18:55

标签: perl datetime-format iso8601

在Perl中,我使用bash命令将ISO-8601时间戳转换为本地格式YYYY-mm-dd HH:MM:SS

例如,这些时间戳用于Google Cloud JSON API。例如 2016-08-09T17:05:05.414-07:00。请查看下面的来源以获取一个工作示例。

这很好用,但有没有办法在不使用bash命令的情况下在Perl中完成相同的操作?当然我确定有,但我找不到任何简单的东西。

#!/usr/bin/perl -w

use strict;
use warnings;

my $f = `date -d 2016-08-09T17:05:05.414-07:00 +'%Y-%m-%d %H:%M:%S'`;
chop $f;

print "$f\n";    # 2016-08-10 02:05:05

1 个答案:

答案 0 :(得分:4)

DateTime模块是明显的选择。您的原始字符串是根据ISO-8601标准格式化的,因此DateTime::Format::ISO8601将直接解析它

然后,只需将时区设置为零并根据需要格式化结果

这是代码

use strict;
use warnings 'all';
use feature 'say';

use DateTime::Format::ISO8601;

say localise_time('2016-08-09T17:05:05.414-07:00');

sub localise_time {
    my ($dt) = @_;

    $dt = DateTime::Format::ISO8601->parse_datetime($dt);
    $dt->set_time_zone('Europe/Amsterdam');

    $dt->strftime('%Y-%m-%d %H:%M:%S');
}

输出

2016-08-10 02:05:05