我需要将以下字符串转换为DateTime个对象,以便我可以比较它们:
2016-06-30T09:00:00-04:00
2016-07-01T15:37:25
两个对象都应该使用EST时区。我怎么能这样做?
答案 0 :(得分:2)
首先,EST
用于指代多个不同的时区偏移。据推测,你的意思是UTC-05:00
。
其次,如果要执行日期时算术,很少想要处理偏移;一个人几乎总是希望时区与地理位置相关联(例如America/New_York
)。 America/New_York
适合在下面使用,但我使用的是更灵活的local
。
use strict;
use warnings;
use feature qw( say );
use DateTime::Format::Strptime qw( );
my $format1 = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%dT%H:%M:%S%Z",
on_error => "croak",
);
my $format2 = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%dT%H:%M:%S",
time_zone => "local",
on_error => "croak",
);
my $dt1 = $format1->parse_datetime('2016-06-30T09:00:00-04:00');
my $dt2 = $format2->parse_datetime('2016-07-01T15:37:25');
然后,你可以做任何你想做的事。您提到要比较它们,可以使用数字比较运算符(例如$dt1 < $dt2
)来完成。
以下示例将时间戳转换为RFC3339时间戳(Internet标准使用的时间戳格式):
$dt1->set_time_zone("UTC");
say "dt1: " . $dt1->strftime("%Y-%m-%dT%H:%M:%SZ");
$dt2->set_time_zone("UTC");
say "dt2: " . $dt2->strftime("%Y-%m-%dT%H:%M:%SZ");