BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

うるう年

PS3が今年をうるう年と勘違いしてバグったらしいですね。我々の業界ではうるう年にまつわるシステム障害というのは定番だけど、今年は勘違いするような年でもないので(あ、オリンピックイヤーではあるか)、どうしてバグったのかは謎。

さて、うるう年(1年が366日)というのは4年に1回必ず訪れるものだと思われることが多いかもしれないけど、その解釈は間違いなわけです。このことはある程度経験のあるプログラマには常識だったりします。なぜなら何年かプログラマをやっていれば教えられなくてもこの問題に気付く機会が必ず1度くらいは訪れるはずだから。

グレゴリオ歴におけるうるう年とは、次の通り。(Wikipediaより

  1. 西暦年が4で割り切れる年は閏年
  2. ただし、西暦年が100で割り切れる年は平年
  3. ただし、西暦年が400で割り切れる年は閏年

このルールを知らずに(あるいは手抜き実装により)単純に4年に1度のうるう年で計算してしまいカレンダーが狂ってシステムに重大な障害が起きることがしばしばある。というかそれ以前にちょい計算でうっかりうるう年を考慮すること自体を忘れていることも超多いです。(すいません俺も先日やった)

しかし最近のアプリケーションフレームワーク、たとえばRuby on Railsなんかだと、Date、Time型が拡張されて自動的にうるう年を考慮した形で日時の演算ができたりする。これは無茶苦茶便利な一方で、「うるう年とは」というプログラマには必須な常識(でも一般的には雑学のようなもの)を学ぶ機会が失われ、かえってバグが増えることを危惧します。フレームワークが便利になってもどうしても自分でゴリゴリ書かなけばいけないシチュエーションというのは必ずあるので。…ということでこのエントリーを書いてみました次第です。

コメント

2010/3/ 4 16:42 from けろり

チリの地震で地球の自転周期がちょっと変わったらしいですが
そのうち、うるうの対応方法も変わったりするんでしょうか。
そうしたら2000年問題以上に大変な予感。