Perlコーディング

x日後の日付を求める

2007年11月25日
指定した日付からx日後の日付を求めてみます。
Perlでは、1970/01/01 000:00:00からの秒数で日付を計算します。

まずは、現在日を求めてみます。昨日はstrftimeを使って求めましたが、今日は1970/01/01 000:00:00からの秒数から計算する方法を用います。
($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(time);
とすると現在日時が得られます。
表示してみると(実行日2007/11/25)、
$day = 25
$month = 10
$year = 107
が返ってきています。つまり、月には1を足し、年には1900を足すと現在日になります。


次に、現在日時を1970/01/01 000:00:00からの秒数に直してみます。timelocal関数を使います。
localtime(time)で求めた現在日をtimelocal関数で秒数に直してみます。

($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(time);
$times = timelocal($sec, $min, $hour, $day, $month, $year);
timeと$timesの値を表示してみると、同じであることがあります。これは当たり前ですね。

では、$yearに1900を足して秒数を求めてみます。
($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(time);
$times = timelocal($sec, $min, $hour, $day, $month, $year+1900);
timeと$timesの値は同じです。

つまり、$monthは5月なら4を、11月なら10をという具合に、1を引いた値を引き渡します。年は1900を足しても足さなくてもよいようです。


それでは、指定した日のx日後(前)の日付を取得してみます。


指定した日のx日後(前)の日付を取得する関数を作成しました。
Perlでは、1970/01/01 000:00:00からの秒数で日付を計算します。timelocal関数を使うと計算できます。
2007/11/20の5日後の場合、
$year = 2007;
$month = 11;
$day = 20;
$times = timelocal(0, 0, 0, $day, $month-1, $year);
で 1970/01/01 00:00:00 から 2007/11/20 00:00:00 までの秒数が求められます。

5日後なので、5日間の秒数は
$x = 5;
$num = 60 * 60 * 24 * $x;
で求められます。
$times + $num の秒数を、日付に直せばOKです。

( undef, undef, undef, $day, $month, $year ) = localtime($times + $num);
$year += 1900;
$month += 1;

で2007/11/20の5日後の日付がわかります。

x日前の場合、$xに負の値を渡せばOKです。


sprintf関数を使って、日付の書式をかえてやります。
yyyymmdd書式にするためには
$yyyymmddJ = sprintf("%04d%02d%02d", $year, $month, $day);



自由に使えるモジュールも公開されています。
Date::Simpleモジュール