• ベストアンサー

X月Y日がZ曜日なのは西暦何年か

X月Y日がZ曜日なのは西暦何年かをだすにはどうすればいいのでしょう?

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.5

曜日の算出はツェラーの公式で算出すれば、あとは#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回、ちゃんと今年も入っていたから計算間違いはないはず。 前後を適宜補って実行してみてください

yuuji159
質問者

お礼

ツェラーの公式っていうのがあるんですね。これを使えばなんとかできそうです。 いろいろと詳しくありがとうございました。

その他の回答 (6)

  • omni2
  • ベストアンサー率53% (33/62)
回答No.7

No6です。 計算してみましたがだめでした。 $yearの範囲が限られてくるみたいでつかえません。 わすれてください。

yuuji159
質問者

お礼

回答ありがとうございました。

  • omni2
  • ベストアンサー率53% (33/62)
回答No.6

>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の年数を変更してループさせればいいのではないでしょうか??

参考URL:
http://cocohome.hp.infoseek.co.jp/cocohome/l_nisukeisan.html
noname#129708
noname#129708
回答No.4

ただし、1900/1/1 以前は対応していません。 この項目「ユーザー設定」で、西暦を和暦にも簡単に書き換えられます。

noname#129708
noname#129708
回答No.3

エクセルだと簡単に出ますよ。 たとえば、2000年1月1日は何曜日かを調べるには、2000/1/1 と入力します。そして、上の方に「書式(o)」というのがありますから、それをクリックします。続いて「セル」-「表示形式」-「日付」-「2001/3/14 水曜日」とクリックしていき、最後に「OK」をクリックすれば、2000年1月1日 土曜日」と表示が変わります。

yuuji159
質問者

お礼

回答ありがとうございます。 でも、それは年月日から曜日をもとめる場合ですよね? すいません、質問の仕方がまずかったですね。。。 例えば1月1日が土曜日なのは西暦何年かを求めるときはどうすればいいのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

X月Y日がZ曜日というのは、たくさん答えがあるので、 もう少し絞ってください。 例えば、元年から今までとか一番近い未来でとか

yuuji159
質問者

お礼

なるほどそうですね・・・ では、条件に当てはまる一番近い過去の西暦はどうやって求めればいいのでしょうか?

回答No.1

Perlに関しては無知ですが・・・ロジックなら分かります。 ただ、関数も当然しらないのでご容赦を。 まず、年月日が分からないと曜日は出しようがないので、 年(西暦)の幅を決めます。 その西暦(i)の幅で、ループさせます。 ループ内において、i年X月Y日の曜日を出します。 その曜日がZ曜日ならば、iを予め用意した配列に入れます。 ループ終了後に、配列にある全ての西暦が結果です。 どうですかねぇ。

yuuji159
質問者

お礼

回答ありがとうございます。 なるほど、それならできそうですね。

関連するQ&A