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

Perl 将ISO-8601时间戳从UTC-7:00转换为“欧洲/阿姆斯特丹”(CEST)时间,即UTC+2:00,perl,datetime-format,iso8601,Perl,Datetime Format,Iso8601,在Perl中,我使用bash命令将ISO-8601时间戳转换为本地格式YYYY-mm-dd HH:mm:SS 例如,这些时间戳在谷歌云JSON API中使用。例如 2016-08-09T17:05:05.414-07:00。请查看下面的源代码,以了解工作示例 这很好,但是有没有一种方法可以不用bash命令在Perl中实现同样的功能?当然我肯定有,但我找不到任何简单的东西 #!/usr/bin/perl -w use strict; use warnings; my $f = `date -d

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

例如,这些时间戳在谷歌云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
模块显然是这方面的选择。您的原始字符串是根据ISO-8601标准格式化的,因此将直接解析它

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

这是密码

严格使用; 使用“全部”警告; 使用特征“说”; 使用DateTime::Format::ISO8601; 说当地时间‘2016-08-09T17:05:05.414-07:00’; 次本地化时间{ 我的$dt=@; $dt=DateTime::Format::ISO8601->parse_DateTime$dt; $dt->设置“欧洲/阿姆斯特丹”时区; $dt->strftime“%Y-%m-%d%H:%m:%S”; } 输出 2016-08-10 02:05:05 模块显然是这方面的选择。您的原始字符串是根据ISO-8601标准格式化的,因此将直接解析它

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

这是密码

严格使用; 使用“全部”警告; 使用特征“说”; 使用DateTime::Format::ISO8601; 说当地时间‘2016-08-09T17:05:05.414-07:00’; 次本地化时间{ 我的$dt=@; $dt=DateTime::Format::ISO8601->parse_DateTime$dt; $dt->设置“欧洲/阿姆斯特丹”时区; $dt->strftime“%Y-%m-%d%H:%m:%S”; } 输出 2016-08-10 02:05:05
我不确定你的算术!8月9日17:05:05加上时区的七个小时是8月10日00:05:05+2个小时是因为我的时区塞斯特/阿姆斯特丹!然后你需要$dt->设置时区'2:00'。出于某种原因,$dt->set_time_zone'CEST/Amsterdam'不起作用,但我正在寻找原因`在您的解决方案中,您能否使用UTC到CEST的额外计算,从而增加额外的2小时数?@Eric:我使用了欧洲/阿姆斯特丹,这很好。看我修改过的答案。我不确定你的算术!8月9日17:05:05加上时区的七个小时是8月10日00:05:05+2个小时是因为我的时区塞斯特/阿姆斯特丹!然后你需要$dt->设置时区'2:00'。出于某种原因,$dt->set_time_zone'CEST/Amsterdam'不起作用,但我正在寻找原因`在您的解决方案中,您能否使用UTC到CEST的额外计算,从而增加额外的2小时数?@Eric:我使用了欧洲/阿姆斯特丹,这很好。见我修正后的答案。