- ベストアンサー
X月Y日がZ曜日なのは西暦何年か
X月Y日がZ曜日なのは西暦何年かをだすにはどうすればいいのでしょう?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
曜日の算出はツェラーの公式で算出すれば、あとは#1さんのご回答をコーディングするのみで1582年10月15日(金)以降対応となります ツェラーの公式 http://easycgi.xrea.jp/tips/perl/zeller.htm んでコーディングしてみました。 ### ex. 1583年から2100年までで、10月10日が月曜日となる年は? $mon = 10; $day = 10; $j = 0; ##カウンター for( $i=1583; $i<=2100; $i++){ if( $mon<3){$year = $i-1; $month=$mon+12;}else{$year=$i;$month=$mon;} $week = ($year + int($year/4) - int($year/100) + int($year/400) + int((13*$month + 8)/5) + $day) %7; if ( $week == 1 ){ $j ++; print "$i,"; } } print "<br>$j回ありました."; ### result 75回、ちゃんと今年も入っていたから計算間違いはないはず。 前後を適宜補って実行してみてください
その他の回答 (6)
- omni2
- ベストアンサー率53% (33/62)
No6です。 計算してみましたがだめでした。 $yearの範囲が限られてくるみたいでつかえません。 わすれてください。
お礼
回答ありがとうございました。
- omni2
- ベストアンサー率53% (33/62)
>1月1日が土曜日なのは西暦何年かを求めるときはどうすればいいのでしょうか? これでいいのかな?? 間違ってたら誰かが直してくれると・・ use Time::Local; my $time = timelocal($sec,$min,$hours,$mday,$mon,$year); my $wday = (localtime $time)[6]; print "wday -- $wday\n"; foreach文などで、$wdayが6(土曜日)になるまで、$yearの年数を変更してループさせればいいのではないでしょうか??
ただし、1900/1/1 以前は対応していません。 この項目「ユーザー設定」で、西暦を和暦にも簡単に書き換えられます。
エクセルだと簡単に出ますよ。 たとえば、2000年1月1日は何曜日かを調べるには、2000/1/1 と入力します。そして、上の方に「書式(o)」というのがありますから、それをクリックします。続いて「セル」-「表示形式」-「日付」-「2001/3/14 水曜日」とクリックしていき、最後に「OK」をクリックすれば、2000年1月1日 土曜日」と表示が変わります。
お礼
回答ありがとうございます。 でも、それは年月日から曜日をもとめる場合ですよね? すいません、質問の仕方がまずかったですね。。。 例えば1月1日が土曜日なのは西暦何年かを求めるときはどうすればいいのでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
X月Y日がZ曜日というのは、たくさん答えがあるので、 もう少し絞ってください。 例えば、元年から今までとか一番近い未来でとか
お礼
なるほどそうですね・・・ では、条件に当てはまる一番近い過去の西暦はどうやって求めればいいのでしょうか?
- mitochan1975
- ベストアンサー率35% (56/159)
Perlに関しては無知ですが・・・ロジックなら分かります。 ただ、関数も当然しらないのでご容赦を。 まず、年月日が分からないと曜日は出しようがないので、 年(西暦)の幅を決めます。 その西暦(i)の幅で、ループさせます。 ループ内において、i年X月Y日の曜日を出します。 その曜日がZ曜日ならば、iを予め用意した配列に入れます。 ループ終了後に、配列にある全ての西暦が結果です。 どうですかねぇ。
お礼
回答ありがとうございます。 なるほど、それならできそうですね。
お礼
ツェラーの公式っていうのがあるんですね。これを使えばなんとかできそうです。 いろいろと詳しくありがとうございました。