| 2010年03月02日(火) |
103261回目の火曜日 |
たまには時事ネタを。
PS3で障害が発生したそうですが、その原因が「うるう年」だったそうで。なぜか2010年をうるう年と認識してしまい、2010年2月29日という存在しない日付を内蔵時計が示していたことで、インターネットとの照合が取れずに不具合が起きていたそうな。
人ごとじゃねぇ、と全国のIT系技術者の皆さんも思っておられるでしょうが、同時にこうも思っておられるはず。
なぜに、うるう年。
何となく自分にとって計算機と並んで、カレンダープログラムというのはプログラムの基礎みたいなものです。 そんなところでつまずくなんて信じられません。
年数表示を下2桁にしたことでY2K問題が起こったのが、もう10年も前のことです。これは100年単位の視野が無かったために起こった現象ですが、うるう年は1日単位だろうが何千年単位だろうが、どんな視野でも必ず入っていなければならない問題です。
昔、受験の時に、どうやっても解けないと思って諦めていた問題が、「何年後の何月何日は何曜日でしょう?」という問題でした。
このときの基本の考え方が、西暦元年元日(つまり0001年1月1日)から今までの日数を計算することです。 たとえば今日の日付で2010年3月2日だったらまず2010年なので基本的に
365 × 2009 = 733285
うるう年は4の倍数年なので
733285 + (2009 ÷ 4) = 733787(小数点以下切り捨て)
4の倍数年でも100の倍数年はうるう年ではない年があるので
733787 − (2009 ÷ 100) = 722767(小数点以下切り捨て)
100の倍数でも400の倍数年はうるう年である年があるので
722766 + (2009 ÷ 400) = 722761(小数点以下切り捨て)
これが西暦元年元日から2009年3月31日終了時点までの経過日数。 つづいて3月なので2月末日までの日数を数えます。
1月は31日まで。 そして2010年は閏年ではないため、2月は28日までなので、
31 + 28 = 59
今月は2日目なので
59 + 2 = 61
そして西暦元年元日から数えた2010年3月2日は
722761 + 61 = 722822
ということで722822日目。 何曜日かを求めるには割り算を使います。西暦元年元日は月曜日。1を7で割ると「0あまり1」。つまり、1が余れば月曜日、3が余れば水曜日なので、
722822 ÷ 7 = 103260 あまり 2
2が余れば「火曜日」という答えが出てくるわけです。
この西暦元年元日までさかのぼる計算、結構好きです。正確ではありませんがキリストの生きた時代までカレンダーをさかのぼるのですよ、ロマンを感じますね。 (実際はグレゴリオ暦が最初に採用されたのがグレゴリオ歴1582年10月15日なのでそれ以前の日付は数えられた歴史はないのですが)
今回使った年、月、日を全て代数に置き換えると汎用的に利用することができます。ただし、カレンダーの月については、数式化することはできないので、それぞれの月が持っている日数をどこかに記憶しておかなければなりません。
これだけならまだ簡単なのですが、会社学校などの年度やら法律がからむとややこしくなるのがカレンダー。基礎的でいて奥が深いのです。
しかし、それでも2010年を閏年にする計算ってどんなプログラムなんだろう……?
|
|