曜日を取得する

日付を指定すると、曜日を返します。このサブルーチンは、ツェラーの公式を使って曜日を特定します。

サブルーチン名

GetWeekDay()

引数

評価したい日付を西暦、月、日に分けて指定します。

  1. 西暦(1582 ~)
  2. 月(1 ~ 12)
  3. 日(1 ~ 31)
  4. フラグ(1 or null)

指定する日付は、西暦1582年10月15日以降が有効です。

戻値

4 番目の引数を指定しなかった場合には、各曜日に対応した数字が返ります。4 番目の引数を指定した場合には、曜日(漢字)が返ります。対応は以下の通りです。

曜日 戻値
0
1
2
3
4
5
6

もし日付に、西暦1582年10月15日より前の日付が指定された場合には、 -1 が返ります。また、このサブルーチンでは指定された日付が実在する日付かどうかをチェックしませんので、ご注意ください。実在するかどうかは、「存在する日付かどうかをチェックする」サブルーチンをご覧下さい。

使い方

西暦1950年1月20日の曜日を取得するには、

my $year = 1950;
my $month = 1;
my $day = 20;
my $weekday = &GetWeekDay($year, $month, $day);

とします。この場合、4 番目の引数を指定しておりませんので、曜日を表す数字が返ってきます。指定の日付の曜日は、金曜日ですので、「5」がスカラー変数 $weekday に格納されます。もし、以下のように 4 番目の引数に1を指定すると、スカラー変数 $weekday には、「金」が格納されます。

my $year = 1950;
my $month = 1;
my $day = 20;
my $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;
    }
 }