トップ > Perl Tips > 曜日 ~Zeller(ツェラー)の公式~


 ■ 曜日 ~Zeller(ツェラー)の公式~

曜日ってどうやって求めるの?と思った方もいらっしゃると思いますが、
実は、求めるための公式があるのです。「Zeller(ツェラー)の公式」といいます。
これで、1582年10月15日(金)以降のある日付の曜日を求めることができます。

年 + 年/4 - 年/100 + 年/400 + (13*月+8)/5 + 日 を7で割ったときのあまりが、
0ならば日曜、1ならば月曜・・・6ならば土曜になります。
(ただし、1月、2月は前年の13月、14月として計算することになっています。)

これを、Perlの式で表すとこうなります。
($year + int($year/4) - int($year/100) + int($year/400) + int((13*$month + 8)/5) + $day) %7


簡単なサンプルを見てみましょう。

<サンプル>


#!/usr/bin/perl

# 年月日の指定(例:1945年8月15日水曜日)
$year = 1945;
$month = 8;
$day = 15;

if ($month == 1 || $month == 2) {
$yr = $year;
$yr--;
$mt = $month;
$mt += 12;
}
else {
$yr = $year;
$mt = $month;
}
$i = ($yr + int($yr/4) - int($yr/100) + int($yr/400) + int((13*$mt + 8)/5) + $day) %7;
@wday = ('日','月','火','水','木','金','土');
print "Content-type: text/html\n\n";
print "$year" . "年$month" . "月$day" . "日($wday[$i]" . ")\n";



ツェラーの公式で曜日を求め、表示するスクリプトです。
途中で年($year→$yr)と月($month→$mt)の変数名が変わっているのは、
後に年月日を表示する際に元の数字を表示するためです。
(途中で年月の数字に、計算で変更を加えるため、数字が変わります。)


<解説>

# 年月日の指定
ここで調べたい年月日を指定します。

if ($month == 1 || $month == 2) {
(以下省略)
この処理は、1月、2月を前年の13月、14月に変更するための処理です。

$i = ($yr + int($yr/4) - int($yr/100) + int($yr/400) + int((13*$mt + 8)/5) + $day) %7;
ツェラーの公式を使い、曜日を示す数字(0~6)を$iに代入します。

@wday = ('日','月','火','水','木','金','土');
曜日を示す文字を指定します。
('Sun','Mon','Tue','Wed','Thu','Fri',Sat')
などにしてもかまいません。

print "$year" . "年$month" . "月$day" . "日($wday[$i]" . ")\n";
年月日、曜日を表示します。
$wday[$i]で、曜日を示す数字(0~6)を日、月・・・に変えていきます。


応用編:カレンダーを作ろう




トラックバック

このエントリーのトラックバックURL:
http://easycgi.xrea.jp/mt-tb.cgi/45

コメント

とても分かりやすかったです。ありがとうございました。

投稿者 koichi : 2008年8月 7日 19:34