2017-02-17 5 views
-1

я время строки даты в формате 2017-01-12T17:23:14.000-0800Как найти разницу двух дат?

В Perl, есть ли простой способ разобрать две даты, как это и найти разницу без индивидуально извлечения всех полей в строке?

Например, если 2017-01-12T17:23:14.000-0800 и 2017-01-13T17:23:14.000-0800, разница, которую я хочу, будет 1 день (любой разумный формат для этого выхода в порядке).

+0

Поиск модулей, которые работают с датами. Большим парнем партии является [DateTime] (http://search.cpan.org/~drolsky/DateTime-1.42/lib/DateTime.pm), но есть и другие. – zdim

+0

Возможный ответ - http://stackoverflow.com/questions/17040842/how-to-compare-dates-using-perl – jmag

+0

Возможный дубликат [Как сравнить даты с помощью perl?] (Http://stackoverflow.com/questions/17040842/how-to-compare-dates-using-perl) – Tanktalus

ответ

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)); 
+0

спасибо, именно то, что я искал. – user2605633

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.

Смежные вопросы