パセリの知恵袋

曜日計算のやり方

研究日誌 (幸三郎)  2002.11.01 (金)
 先日、あるソフトウェアのソースを覗く機会がありまして・・・(^^;

 なんということはなく、たらたらと見ていたら・・・

 曜日計算のところで吹き出してしまいました。

 (曜日計算というのは、たとえば「2002年11月1日」と入力したら、「金曜日」と出力されるようなところです。)


 なんと、このソフト、2000年1月1日を基準日(?)にして、そこから日数を数えて7で割って曜日を算出していたのです。


 つまり2000年1月1日が土曜日ですから、2002年11月1日は・・・

 365(2000年の日数)+1(2000年は、うるう年)+365(2001年の日数)+31(1月の日数)+28(2月の日数)+31(3月の日数)+30(4月の日数)+31(5月の日数)+30(6月の日数)+31(7月の日数)+31(8月の日数)+30(9月の日数)+31(10月の日数)+1(11月の日数)=1036

 1036÷7=148(余り0)

 余りが0だから金曜日(1なら土曜日・2なら日曜日・・・)

 と計算しているのです・・・。(^^;


 これでは、2002年とかならまだいいですが、もし3000年とか入力した時は、コンピュータ内部ですごい計算をしないといけないでしょうねぇ。(^^;


 と言うか、これ、2000年以前が計算出来ませんよね。(^▽^;


 まぁ入力が2000年から2100年までしか出来ないようになっていましたけれど。





 と言う訳で(?)、今日は曜日計算のお話しです。

 きっと、ここをお読みの方の99.9999%にとって役に立たない知識でしょうね。(^^;



 まず、曜日を算出したい年月日の月が

 1月か2月のときは、年から1引いて、月に13を足して下さい。

 3月以降のときは、月に1を足して下さい。


 そして

 365.25を掛けた数をAAとします。(小数点以下切り捨て)

 30.6を掛けた数をBBとします。(小数点以下切り捨て)

 400で割った数をCCとします。(小数点以下切り捨て)

 100で割った数をDDとします。(小数点以下切り捨て)

 AABBCCを足し、DDを引き、さらに429引いた数をEEとします。

 EEで割り、小数点以下を切り捨てて、を掛けた数をFFとします。

 EEからFFを引いた数が

 0なら月曜。
 1なら火曜。
 2なら水曜。
 3なら木曜。
 4なら金曜。
 5なら土曜。
 6なら日曜。

 です。





 文章にすると長いですが、たとえばベーシックのプログラムで書くと


 年=A 月=B 日=C とすれば


 IF B<3 THEN A=A-1 : B=B+13 : ELSE B=B+1

 X=int(365.25*A)+int(30.6*B)+int(A/400)+C-int(A/100)-429

 Y=X-int(X/7)*7


 と、3行で終わるプログラムです。





 曜日を計算するときの参考にして下さい。<そんなときは普通ナイ!





 それから・・・


 『なんで、この計算式で曜日が出るの?』なんて聞かないで下さいね。(^^;


 この計算式で曜日が決められていると思って下さい。





最近、『ちょっぴりためになる日誌』がないですね、と言われて必死に考えたんですが・・・
こんなことろでご勘弁を。m(_ _)m


研究日誌 (幸三郎)  2002.11.05 (火)
 前回の日誌で曜日計算のやり方を紹介しましたが、あれはあくまで現在の暦の計算方法です。


 あの計算方法で西暦元年1月1日を計算し、「そうか!キリストが生まれた年の元旦は月曜日なんだ!」とか思わないで下さいね。


 と言う訳で、役に立たない知識パート2です。(^^;





 現在、私たちが使っているのはグレゴリオ暦(グレゴリウス暦とも言う)と言います。


 これは16世紀から使われ始めた暦で、それまではユリウス暦という暦が使われていました。


 ユリウス暦は、紀元前46年にジュリアス・シーザーが定めたと言われている暦で、一年の長さを「365.25日」と考え、4年に一度の閏(うるう)年だけを決めていました。


 その後、一年の長さが約「365.2422日」と分かり、1582年にローマ法王グレゴリウス13世が勅令で改定したのがグレゴリオ暦です。


 これは、

 (1)4年に一度閏年にする。

 (2)しかし、100年に一度は閏年を省く。

 (3)ただし、400年に一回は省かずに閏年にする。

 というものです。



 この暦の切り替えのため、1582年の10月は、5日から14日までが存在しません。


 私は会社で給与計算も担当しているのですが、もし今こんな暦の切り替えがあって、10日も勤務日数が少ない月とかあったら・・・、さぞかし大変なことになったでしょうねぇ。(^^;





 ちなみに数年前、超有名日本語ワープロソフト一○郎で、『2000年が閏年のはずなのになっていない!』というトラブルがありましたが、これは(1)と(2)は組み込んでいたのに、(3)を忘れていたためです。


 そういうミスを犯さないためにも、しっかり覚えておきましょうね。<だからそんなときは絶対ナイ!


研究日誌 (幸三郎)  2002.11.10 (日)
 前回の曜日計算の日誌で、

 あの計算方法で西暦元年1月1日を計算し、「そうか!キリストが生まれた年の元旦は月曜日なんだ!」とか思わないで下さいね。

 なんて前振りしておきながら、結果を書いていませんでしたね。(^^;



 東京・三鷹の東京天文台によると、西暦元年1月1日は土曜日だとなっています。



 ただ、これには諸説ありまして、西暦元年前後は暦が整っておらず閏年が曖昧だったため西暦4年を閏年にせず、日曜日だったとする学説もあることを付け加えておきます。










 それがどうした>という突っ込みは、ナシでお願いします。m(_ _)m


研究日誌 (幸三郎)  2002.11.15 (金)
 前回の西暦元年1月1日の曜日について補足です。



 今のような曜日の習慣が西洋で広まったのは3世紀ごろで、『西暦元年には曜日は無かったという学説があることもさらに付け加えておきます。










 それと今回紹介した曜日の計算式ですが、これも2621年で1日ずれてしまいます。



 つまり、27世紀には改修しなければなりません。



 ご注意下さい。










 これほど役に立たない知識も珍しいですね。<分かってるならヤメロ!


研究日誌 (幸三郎)  2007.03.19 (月)
 無駄知識として「パセリの知恵袋」にアップしている『曜日計算のやり方』ですが、掲示板でSINGOさんから教えて頂いた情報によると、工作機械とかだとシステムに「日付」と「時間」のパラメータは存在していますが、「曜日」のパラメータは無く、平日のみ稼動するプログラムを作りたい場合などに、これが役に立っているそうです。

 と言うか、今「曜日 計算式」でGoogle検索すると、私のところがトップなんですね。

 びっくりしてしまいました。(^^;


 SINGOさん作成の、CNCのプログラムソースを追加で載せておきます。

 CNCのシステム変数等で悩んでいる方、参考にして下さい。


#106=#3011

#110=FIX[#106/10000]
#111=#106-[#110*10000]
#111=FIX[#111/100]
#112=#106-[#110*10000]
#112=#112-[#111*100]

IF[#111 LT 3]GOTO 300
#111=#111+1
GOTO 310
N300
#110=#110-1
#111=#111+13
N310

#113=FIX[365.25*#110]+FIX[30.6*#111]+FIX[#110/400]+#112-FIX[#110/100]-429
#114=#113-FIX[#113/7]*7


・FUNAC 31i で動作確認
・もっと古いものでも動くはず
・#3011はシステム変数の日付
・カスタム変数は#106,#110-#114を使用し、#114が曜日の数値
・「IF-THEN-ELSE」が(恐らく)使用できないため「GOTO」を使用しているので「N300」「N310」を使用
 いやな場合は「IF」文を3行使用すれば同様の処理が可能




トップへトップページへもどる