如何找到两个日期的差异?

时间:2017-02-17 20:48:01

标签: string perl parsing datetime

我的日期时间字符串格式为2017-01-12T17:23:14.000-0800

在Perl中,是否有任何简单的方法来解析这两个日期并找到差异而不单独提取字符串中的所有字段?

例如,给定2017-01-13T17:23:14.000-0800${},我想要的差异是1天(此输出的任何合理格式都可以)。

2 个答案:

答案 0 :(得分:6)

use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
   pattern  => '%Y-%m-%dT%H:%M:%S.%3N%Z',
   on_error => 'croak',
);

my $dt1 = $format->parse_datetime('2017-01-12T17:23:14.000-0800');
my $dt2 = $format->parse_datetime('2017-01-13T17:23:14.000-0800');

my ($y, $m, $d, $H, $M, $S) =
   ( $dt2 - $dt1 )->in_units(qw( years months days hours minutes seconds ));

替代

my ($y, $m, $d) = $dt2->delta_md($dt1)->in_units(qw( years months days ));

my ($m, $d) = $dt2->delta_md($dt1)->in_units(qw( months days ));

my $d = $dt2->delta_days($dt1)->in_units(qw( days ));

my $S = $dt2->delta_ms($dt1)->in_units(qw( seconds ));

答案 1 :(得分:0)

Time::Moment支持指定的字符串表示形式。由于它不是格式良好的ISO 8601表示,我们需要将宽松选项传递给from_string构造函数。

my $tm1 = Time::Moment->from_string('2017-01-12T17:23:14.000-0800', lenient => 1);
my $tm2 = Time::Moment->from_string('2017-01-13T17:23:14.000-0800', lenient => 1);

say $tm1->delta_days($tm2);

输出:

1

为了充分披露,我是Time :: Moment的作者。