end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

perlで、日付&時刻をparseする

https://metacpan.org/release/Date-Calc

perlで日付や時刻を扱う場合、Date::Calc を使用していますが、 2015/3以降、メンテナンスが止まっているようです。

殆どの場合、Date::Calc で足りていますが、 日付&時刻な文字列をparseする必要がある場合、困ることがあります。

そんなときは...、「DateTime::Format::~ 」シリーズとして、

  • DateTime::Format::Strptime
  • DateTime::Format::HTTP
  • DateTime::Format::Mail
  • DateTime::Format::Japanese

があります。

これを機会に Date::Calc → DateTime へ移行した方がよいのかもしれませんね。

以下、ざっと書いたサンプル

#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
use DateTime::Format::Strptime;
use DateTime::Format::HTTP;
use Data::Dumper;

my $TIME_OFFSET_MIN = 1;

main();

sub main {
    print "TIME: ",time(),"\n";
    
    
    my $str_1 = '2019/01/18 18:02:22';

    my $parser_1 =
        DateTime::Format::Strptime->new(pattern=>"%Y/%m/%j %H:%M:%S",
                                        time_zone=>'Asia/Tokyo');
    my $date_1 = $parser_1->parse_datetime($str_1);
    $date_1->add(minutes => $TIME_OFFSET_MIN);
#    print Dumper($date_1);
    print $date_1->datetime,"\n";
    
    my $str_2 = 'Fri, 18 Jan 2019 10:02:22 GMT';
    my $date_2 = DateTime::Format::HTTP->parse_datetime($str_2);
    print $date_2->datetime,"\n";

    # 時刻比較
    print DateTime->compare( $date_1, $date_2 ), "\n";
}

ちなみに、unix timeからの DateTime オブジェクト作成は以下

    my $date_nas = DateTime->from_epoch( epoch =>$unix_time);