何かと面倒な日付処理には 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 $