如何将具有不同格式的两个日期转换为DateTime对象,以便我可以比较它们?

时间:2016-07-01 18:45:23

标签: perl datetime

我需要将以下字符串转换为DateTime个对象,以便我可以比较它们:

2016-06-30T09:00:00-04:00
2016-07-01T15:37:25

两个对象都应该使用EST时区。我怎么能这样做?

1 个答案:

答案 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");