perlで曜日を算出するには

[上に] [前に] [次に]
taka 2000/01/03(月) 00:44:41
 1999年まではperlで曜日を算出するときにツェラーの公式
$m=($y+$y/4-$y/1000+$y/400+(13*m+8)/5+$d)%7
−>int省略、$yは年、$mは月、$dは日、$mは曜日
 を使っていましたが、どうやら2000年になって一日ずれてしまいます。
 別の良い方法、対処法をご存じの方のご意見お願いします。

茶しぶ男 2000/01/03(月) 01:33:47
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@wday_array = ('日','月','火','水','木','金','土');
$date_now = sprintf("%01d年%01d月%01d日(%s)%02d時%02d分",$year+1900,$mon +1,$mday,$wday_array[$wday],$hour,$min);

でやってますが、とりあえず2000年になってもずれは生じてません。

taka 2000/01/03(月) 02:08:12
 済みません、説明不足でした。
$y,$m,$d,は意図的な変数が入ってもいいような曜日算出プログラムです。

あと$wは上のスクリプトで$w(曜日)を間違えていました。
$w=($y+$y/4-$y/1000+$y/400+(13*m+8)/5+$d)%7

moci 2000/01/03(月) 02:50:46
gooで検索かけてみたら、1月と2月は前年の13月、14月として
計算しているようですよ。int()が正しく入っているとして、
あと1000で割っているのも、100の書き間違いでしょうか。
# 100で割り切れる年はうるう年ではない、の部分?

mm 2000/01/03(月) 02:57:02
本を調べてたら、すでにmociさんが正解を出されていますね。
一応、念のため…

スクリプトを提示する際は、正確にお願いします。
元がおかしいいので指摘のしようがありません。
(intは略さない。m の前の$が抜けている。グレゴリオ暦は1000で割ったりしない)

ツェラーの公式をperlで書けば、以下のようになります。
「アルゴリズム辞典」奥村晴彦著より

$y=2000; $m=1; $d=1;
if ($m < 3) {--$y; $m+=12;}
$w=($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7;
print "\$w=$w\n";    # $w=6 つまり土曜日で正解です

taka 2000/01/03(月) 23:12:34
[[解決]]
ありがとうございます。
どうやら100を1000と間違えていたことに気づきました。

>スクリプトを提示する際は、正確にお願いします。
ここを閲覧された方には非常に申し訳ないと思っています。
以後念において記述します。

[上に] [前に] [次に]