今日の日付は「localtime」関数で取得します。実際には、「(秒,分,時,日,月,年,週,ユリウス日,サマータイムのフラグ) = localtime();」のような形式で指定し、結果は9項目(リスト)にセットされます。
ただし、以下の点に注意が必要です。
前日の日付を取得するには、1日を秒数で表した86400秒(=24時間×60分×60秒)を引くことで求められます。
前営業日の算出では、国民の休日を考慮に入れるため、「Calendar::Japanese::Holiday」モジュールを使用しています。「Calendar::Japanese::Holiday」はインストールが必要ですので、PPM(Perl Package Manager)を使って、インストールします。インストール方法は[2-1-5.PPM(Perl Package Manager)によるモジュールのインストール]を参照してください。
前月末日は当月1日の前日を算出する方法を使っています。当月末日・翌月末日も同様の方法で算出しています。
# date.pl
# 内容 :当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
#使用方法 : c:\>perl date.pl
use Time::Local qw( timelocal );
use Calendar::Japanese::Holiday;
open(OUT1,">output.txt");
#
# 当日の日時を取得
#
($sec,$min,$hours,$day,$month,$year,$wday,$yday,$isdst) = localtime();
$year = $year + 1900;
$month = $month + 1;
print OUT1 "当日 = ",$year,"/",$month,"/",$day," ",$hours,":",$min,":",$sec."\n";
#
# 前日の日時を取得:24時間×60分×60秒前
#
($sec,$min,$hours,$day,$month,$year,$wday,$yday,$isdst) = localtime(time - 86400);
$year = $year + 1900;
$month = $month + 1;
print OUT1 "前日 = ",$year,"/",$month,"/",$day," ",$hours,":",$min,":",$sec."\n";
# 前営業日の日付を取得する(国民の祝日も考慮する)
# (火曜日から金曜日までは前日、月曜日は、前週の金曜日とする)
#
($sec,$min,$hours,$day,$month,$year) = (localtime(time - 86400))[0,1,2,3,4,5];
$w_time = timelocal( $sec, $min, $hours, $day, $month, $year );
$w_year = $year + 1900;
$w_month = $month + 1;
$w_day = $day;
#while ($wday == 0 or $wday == 6) { #土曜日・日曜日は繰り返す
while (($wday == 0 or $wday == 6) #土曜日・日曜日は繰り返す
or (isHoliday($w_year, $w_month, $w_day))) { #国民の休日は除く
$w_time = $w_time - 86400;
($day,$month,$year,$wday) = (localtime($w_time))[3,4,5,6];
$w_year = $year + 1900;
$w_month = $month + 1;
$w_day = $day;
}
print OUT1 "前営業日 = ",$w_year,"/",$w_month,"/",$w_day,"\n";
#
# 前月末日を取得:(当月1日の前日)
#
($sec,$min,$hours,$day,$month,$year) = (localtime())[0,1,2,3,4,5];
$day = 1;
$w_time = timelocal( $sec, $min, $hours, $day, $month, $year );
($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];
$year = $year + 1900;
$month = $month + 1;
print OUT1 "前月末日 = ",$year,"/",$month,"/",$day,"\n";
#
# 当月末日を取得:(翌月1日の前日)
#
($sec,$min,$hours,$day,$month,$year) = (localtime())[0,1,2,3,4,5];
$day = 1;
if ($month == 11) { #12月なら翌年1月
$year = $year + 1;
$month = 1;
}
else {
$month = $month + 1;
}
$w_time = timelocal( $sec, $min, $hours, $day, $month, $year );
($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];
$year = $year + 1900;
$month = $month + 1;
print OUT1 "当月末日 = ",$year,"/",$month,"/",$day,"\n";
#
# 翌月末日を取得:(翌々月1日の前日)
#
($sec,$min,$hours,$day,$month,$year) = (localtime())[0,1,2,3,4,5];
$day = 1;
if ($month == 11) { #12月なら翌年2月
$year = $year + 1;
$month = 2;
}
elsif ($month == 10) { #11月なら翌年1月
$year = $year + 1;
$month = 1;
}
else {
$month = $month + 2;
}
$w_time = timelocal( $sec, $min, $hours, $day, $month, $year );
($day,$month,$year) = (localtime($w_time - 86400))[3,4,5];
$year = $year + 1900;
$month = $month + 1;
print OUT1 "翌月末日 = ",$year,"/",$month,"/",$day,"\n";
close(OUT1);
当日 = 2011/9/4 21:55:10
前日 = 2011/9/3 21:55:10
前営業日 = 2011/09/02
前月末日=2011/8/31
当月末日=2011/9/30
翌月末日=2011/10/31