【问题标题】:Convert ISO-8601 timestamp from UTC-7:00 to "Europe/Amsterdam" (CEST) time, which is UTC+2:00将 ISO-8601 时间戳从 UTC-7:00 转换为“欧洲/阿姆斯特丹”(CEST) 时间,即 UTC+2:00
【发布时间】:2016-08-10 08:18:54
【问题描述】:

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

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

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

#!/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

【问题讨论】:

    标签: perl datetime-format iso8601


    【解决方案1】:

    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
    

    【讨论】:

    • “我不确定你的算术!8 月 9 日 17:05:05 加上 7 小时,时区是 8 月 10 日 00:05:05”
    • +2 小时是因为我的时区 CEST/阿姆斯特丹
    • 啊!然后你会想要$dt->set_time_zone('2:00')。出于某种原因$dt->set_time_zone('CEST/Amsterdam') 不起作用,但我正在研究原因。 `
    • 在您的解决方案中,您是否可以使用从 UTC 到 CEST 的额外计算,从而增加额外的 2 小时?
    • @Eric:我改用Europe/Amsterdam,效果很好。请参阅我修改后的答案。
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2020-08-18
    • 2011-05-02
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2011-07-08
    • 2021-03-05
    相关资源
    最近更新 更多