2017-02-17 20 views
-1

私はフォーマットPerlで2017-01-12T17:23:14.000-0800どのようにして2つの日付の違いを見つけることができますか?

で日付時刻文字列を持っている、個別の文字列内のすべてのフィールドを抽出することなく、これらのような二つの日付を解析し、違いを見つけるための簡単な方法はありますか?

たとえば、2017-01-12T17:23:14.000-08002017-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表現ではないので、lenientオプションを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 

は、私は時間::モーメントの著者です。

関連する問題