[TechDay] Java Program 「春分の日」と「秋分の日」

2008/07/05 21:08:00

プログラムでカレンダーを作るときに祝日も分かるようにしたいという要件はよくあります。とはいえ祝日には法律で月日が明記されていない祝日がありますね。
成人の日のように1月の第2月曜日というようにプログラムが容易なものはよいのですが「春分の日」と「秋分の日」はとてもやっかいです。正式には前年の2月の官報に「暦要項」というものに掲載されて正式な祝日日となります。

なんともプログラマー泣かせな仕様ですね。私も上記のような日本の祝日取得のようなJavaプログラムを作るときに初めて知ったことです。

そこでいろいろ調べた結果、国立天文台に聞いてみることにしました。
国立天文台には質問受け付けのサイトがあります。

ここで質問をすると以下のメールが飛びます。

回答メールは以下。なかなか親切ですね。

その回答で教えてもらったサイトが以下の2つのサイトです。
◆正式な国立天文台のホームページ
http://www.nao.ac.jp/QA/faq/a0301.html


◆以下は民間の人が公開しているページ
http://www.h3.dion.ne.jp/~sakatsu/sekki24_topic.htm

上記のページで紹介されている計算式をJavaプログラムにしたものが以下です。

(テキストは以下)

//import java.util.Calendar;
//import java.util.GregorianCalendar;
class shunbunShuubun {
public static void main(String[] args)
{
if (args.length < 2)
{
System.out.println("java shunbunShuubun yyyy [shun|shuu]");
}

int yyyy = Integer.parseInt(args[0]);
int ymd = 0;
if (args[1].equals("shun")) {
ymd = getShunbunDd(yyyy);
System.out.println("3月"+ymd+"日");
} else if (args[1].equals("shuu")) {
ymd = getShuubunDd(yyyy);
System.out.println("9月"+ymd+"日");
} else {
System.out.println("Bad parameter. arg[1] = [shun|shuu]");
}
}

/* -----------------------------------------------------------------
春分の日を算出(1900〜2099年まで)
国立天文台へ確認した結果以下を紹介された:実際は官報により決定
http://www.nao.ac.jp/QA/faq/a0301.html
メール件名:[2593]春分・秋分の計算式 Wed, 18 Oct 2006 13:22:54 +0900
http://www.h3.dion.ne.jp/~sakatsu/sekki24_topic.htm
春分:21.4471 + (0.242377*(year - 1900)) - (year -1900)/4
-----------------------------------------------------------------
*/
public static int getShunbunDd(int year) {
double date = 21.4471d + (0.242377d * (year - 1900)) - Math.floor((year -1900)/4.0d);
return (int) Math.floor(date);
}

/* -----------------------------------------------------------------
秋分の日を算出(1900〜2099年まで)
国立天文台へした結果:実際は官報により決定
秋分:23.8896 + (0.242032*(year - 1900)) - (year -1900)/4
-----------------------------------------------------------------
*/
public static int getShuubunDd(int year) {
double date = 23.8896d + (0.242032d * (year - 1900)) - Math.floor((year -1900)/4.0d);
return (int) Math.floor(date);
}
}

◆以下、上記プログラムの実行結果

いかがでしょうか。
同じ悩みを持つプログラマーの方の参考になれば幸いです。

このエントリーの原文が掲載されている外部サイトを確認する
※このエントリは builder メンバーにより投稿されたものです。シーネットネットワークスジャパン および builder編集部の見解・意向を示すものではありません。
このユーザーブログエントリーはbuilder編集部によりピックアップされてます。
米フォレスター・リサーチ社 シニアアナリスト Jeremiah K.Owyang氏を迎え、同氏が提唱するソーシャルテクノロジーを効果的に活用方法するための方法『POST』を日本で初めて紹介する注目のリアルイベント
  • 新着記事
  • 人気記事
  • 特集
  • ブログ