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と間違えていたことに気づきました。
>スクリプトを提示する際は、正確にお願いします。
ここを閲覧された方には非常に申し訳ないと思っています。
以後念において記述します。
[上に]
[前に]
[次に]