はじめに
アプリケーションエンジニアにとって、日付・カレンダーに関する業務ロジックを組み立てる機会はとても多いことと思います。最近の言語処理系はカレンダー管理系の標準ライブラリを持っていることが多いと思うので、正しく使いこなせればそれほど難しいことでは無くなってきています。この記事では、日付・カレンダーに関する業務ロジックの典型的なものを Java, Python のコードスニペットとして紹介したいと思います。Java, Python における標準ライブラリを活用した実用的な例に加えて、日付・カレンダー処理に関する基礎知識とアルゴリズムも解説します。原理を把握したい方、便利なカレンダーライブラリの無い環境でどうしても実現しないといけない方などの参考にもなるかと思います。
日付・カレンダー処理の基礎知識
ちょっと回り道に感じるかもしれませんが、まずは基礎知識から説明しておきます。後述のロジック解説の前提知識になってきますので、初めに説明させてください。現代の暦法はグレゴリオ暦
現代社会で主に使われているカレンダーは、グレゴリオ暦と呼ばれています。平均的に地球が太陽の周りを1周するのにかかる日数は、およそ365.2422日です。これに極力近づけるため、閏年を使って1年の平均日数を365.2425日にしたのが、グレゴリオ暦です。グレゴリオ暦は1582年10月15日からカトリック世界で使われはじめ、徐々に世界中に浸透していきました。日本では1873年1月1日から使われています。なお、グレゴリオ暦の前はユリウス暦が使われていました。ユリウス暦の1582年10月4日の翌日がグレゴリオ暦の1582年10月15日となっています。歴史上の日付は、1582年10月4日まではユリウス暦、1582年10月5日〜14日は存在せず、1582年10月15日以降はグレゴリオ暦として取り扱われることが通例となっています。グレゴリオ暦を特徴付ける性質は、閏年のルールです。
- 西暦年が4で割り切れる年は閏年
- ただし、西暦年が100で割り切れる年は閏年としない
- でも、西暦年が400で割り切れる年はやっぱり閏年