日付を指定すると、曜日を返します。このサブルーチンは、ツェラーの公式を使って曜日を特定します。
■ サブルーチン名
GetWeekDay
■ 引数
評価したい日付を西暦、月、日に分けて指定します。
- 西暦(1582 〜)
- 月(1 〜 12)
- 日(1 〜 31)
- フラグ(1 or null)
指定する日付は、西暦 1582 年 10 月 15 日以降が有効です。
■ 戻値
4 番目の引数を指定しなかった場合には、各曜日に対応した数字が返ります。4番目の引数を指定した場合には、曜日(漢字)が返ります。対応は以下の通りです。
曜日 戻値 日 0 月 1 火 2 水 3 木 4 金 5 土 6 もし日付に、西暦 1582 年 10 月 15 日より前の日付が指定された場合には、 -1 が返ります。また、このサブルーチンでは指定された日付が実在する日付かどうかをチェックしませんので、ご注意ください。実在するかどうかは、「存在する日付かどうかをチェックする」サブルーチンをご覧下さい。
■ 使い方
西暦 1971 年 3 月 28 日の曜日を取得するには、
$year = 1971;
$month = 3;
$day = 28;
$weekday = &GetWeekDay($year, $month, $day);とします。この場合、4 番目の引数を指定しておりませんので、曜日をあらわす数字が返ってきます。指定の日付の曜日は、月曜日ですので、「1」がスカラー変数 $weekday に格納されます。もし、以下のように 4 番目の引数に 1 を指定すると、スカラー変数 $weekday には、「月」が格納されます。
$year = 1971;
$month = 3;
$day = 28;
$weekday = &GetWeekDay($year, $month, $day, 1);
■ サブルーチン
sub GetWeekDay {
my($year, $mon, $day, $flag) = @_;
if($year == 1582) {
if($mon < 10) {
return -1;
} elsif($mon == 10) {
if($day < 15) {
return -1;
}
}
} elsif($year < 1582) {
return -1;
}
if($mon == 1 || $mon == 2) {
$year --;
$mon += 12;
}
my $week = ($year + int($year/4) - int($year/100) + int($year/400) + int((13*$mon+8)/5) + $day) % 7;
if($flag) {
my @map = ('日', '月', '火', '水', '木', '金', '土');
return $map[$week];
} else {
return $week;
}
}
|
※修正履歴
- 2003/01/06 曜日がずれる日が存在するバグを改修。