[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);
}
}

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

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

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]