Perl-users.jp

日付の取り扱い

何かと面倒な日付処理には DateTime.pmをつかいます。

生成

use strict;
use warnings;

use DateTime;

#日付を指定して生成
$dt = DateTime->new(
    time_zone => 'Asia/Tokyo',
    year      => 2008,
    month     => 8,
    day       => 4,
    hour      => 15,
    minute    => 0,
    second    => 0
);

#epochから生成
$dt = DateTime->from_epoch( time_zone => 'Asia/Tokyo', epoch => 1217829600 );

#現在の日付(時間ふくむ)
$dt = DateTime->now( time_zone => 'Asia/Tokyo' );

#現在の日付(時間含まない)
$dt = DateTime->today( time_zone => 'Asia/Tokyo' );

#月末 2008-08-31T00:00:00
$dt = DateTime->last_day_of_month( year => 2008, month => 8 );

#2008年正月から250日目 2008-09-06T00:00:00
$dt = DateTime->from_day_of_year( year => 2008, day_of_year => 250 );

色々なインスタンス生成の方法があります。

計算

#3日後
$dt = $dt->add( days => 3 );

#2ヶ月前
$dt = $dt->subtract( months => 2 );

#差分
$dt1 = DateTime->new(
    time_zone => 'Asia/Tokyo',
    year      => 2008,
    month     => 8,
    day       => 1
);
$dt2 = DateTime->new(
    time_zone => 'Asia/Tokyo',
    year      => 2008,
    month     => 9,
    day       => 1
);

$dur = $dt2 - $dt1;
say $dur->months;    #1

DateTimeのインスタンスからDateTimeのインスタンスを引くとDateTime::Durationのインスタンスが返って来ます。

フォーマット

#フォーマット指定して表示
say $dt->strftime('%Y/%m/%d %H:%M:%S');    #2008/08/04 15:00:00

#epochで表示
say $dt->epoch;                            #1217829600

#DateTime::Format::*を使って文字列に変換
use DateTime::Format::W3CDTF;
my $dt = DateTime->new(
    time_zone => 'Asia/Tokyo',
    year      => 2008,
    month     => 8,
    day       => 4,
    hour      => 15,
    minute    => 0,
    second    => 0
);
say DateTime::Format::W3CDTF->format_datetime($dt)
    ;    #2008-08-04T15:01:00+09:00

#DateTime::Format::*を使って文字列から変換
$dt = DateTime::Format::W3CDTF->parse_datetime('2008-08-04T15:00:00+09:00');

DateTime::Format::*には他にもDateTime::Format::Japaneseなどがあります。


目次へ

Last modified: $Date: 2008-05-22T09:21:23.154313Z $