プロフィール

ポストイット オンラインプリント i-Note
MoMAstore


記事

カレンダーに関する基本的なロジック、公式

プログラミング

公開日:2009/03/01 15:46

カレンダー的なものを自前でプログラミングするときによく使いそうなのをまとめてみました。
開発環境によっては標準でサポートされていないこともあるので、必要に応じてライブラリ化などをしておくと便利です。
うるう年かどうか判定する
うるう年の条件は、西暦年が4で割り切れ、かつ100で割り切れない年、および400で割り切れる年なので、if文で表すと、
if(year%4==0 && year%100 !=0 || year%400==0) {
    // TRUE:うるう年
} else {
    // FALSE:平年
}
となります。
西暦年から世紀を求める
西暦年から1を引いたものを100で割り1を足すことで求められます。(整数演算もしくは小数点以下を切り捨てる)
century = (year-1)/100+1;
紀元前の世紀を扱う場合も基本のロジックは同じです。もし、紀元前の年を負の値として処理しているような場合は、絶対値にしてから同じ式を使うことで、「紀元前x世紀」のxの値は求められます。
※西暦年は紀元前1年の次の年が紀元1年になります。(yearが0になることはありません)
西暦元年1月1日からの通算日数を求める
「フェアフィールド公式」を使うことで、西暦元年1月1日からの通算日数を簡単な式で求めることができます。
C言語、Javaなどの場合は以下の要領。
(例)yearには西暦年、monthには月(1〜12の値)、dayには日付(1〜31の値)を与える。変数はすべて整数型として宣言しておく。

if(month<=2) {
    year--;
    month += 12;
}
days = (365*year+year/4-year/100+year/400+306*(month+1)/10+day-428);
上の例では、daysに西暦元年からの通算日数が代入されます。
なお、整数演算のできない言語では注意が必要です。(例えばJavaScriptでは除算をすべてMath.floor()でくくるなど)
また、冒頭のif文では、1月と2月の場合の処理をしています。
フェアフィールド公式では、1月、2月の場合、yearから1引いて、monthに12を加算してから計算します。つまり、式ではmonthは3〜14の値をとります。(1月の場合13、2月の場合14)

クリップ