ユリウス日と準ユリウス日

ユリウス日の定義

 ユリウス日というのは紀元前4713年1月1日12:00からの日数を示しています。紀元前4713年1月1日00:00はユリウス 日で-0.5、紀元前4713年1月2日12:00は1.0となります。ただしこのときの日時はUTCに当たります(後述のグレゴリ オ暦のことを考えるとUTCと言っていいかは不明だが...)。

 ユリウス日は値が大きいため準ユリウス日(修正ユリウス日)がよく用いられている。準ユリウス日は1858年11月17日00:00 からの日数を示している。


ユリウス日の計算方法

 計算の際には単純に日数を数えることができないことに注意する。まず紀元前1年の翌年は西暦1年となる(西暦 ゼロ年は存在しない)。次に旧暦からグレゴリオ暦に切り替えられた際に西暦1582年10月4日の翌日を1582年10月15 日としている(10月5日~10月14日が存在しない)。

※このほかにも変な飛び方をしている日付があるかもしれない。詳しくは専門書を参考のこと。

 そのため一般的には以下のような公式を利用してユリウス暦を計算する。

ユリウス日=[Year * 365.25] + [Year / 400] - [Year / 100] + [30.59 * (Month - 2)] + Day - 678912 + 2400000.5 + Hour / 24 + Min / (24*60) + Sec / (24*60*60)

ここで[ ]は括弧内の数値の小数点以下を切り捨てることを意味している。また1月と2月はそれぞれ"前年の"13月、14月として 公式に代入する。また年月日はグレゴリオ暦、時間はUTCとなる。

 例えば2005年1月10日13時34分56秒(UTC)のユリウス日(JD)は

JD = [Year * 365.25] + [Year / 400] - [Year / 100] + [30.59 * (Month - 2)] + Day - 678912 + 2400000.5 + Hour / 24 + Min / (24*60) + Sec / (24*60*60)
  = [2004 * 365.25] + [2004 / 400] - [2004 / 100] + [30.59 * (13 - 2)] + 10 - 678912 + 2400000.5 + 13 / 24 + 34 / (24*60) + 56 / (24*60*60)
  = [731961] + [5.01] - [20.04] + [336.49] + 1721098.5 + 0.5416 + 0.02361 + 0.0006
  = 731961 + 5 - 20 + 336 + 1721099.06581
  = 732326 + 5 - 20 + 336 + 1721099.06581
  = 2453381.06581


準ユリウス日の計算方法

 準ユリウス日はユリウス日に2400000.5を加算した値となる。

準ユリウス日=ユリウス日+2400000.5


ソースコード

//
//	ユリウス日の取得
//
//	年月日はグレゴリオ暦(普通の西暦)、時間はUTCで渡すこと
//
bool	GetJD(double& dJD,int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec)
{
	bool	ret;

	ret = true;
	if(nMonth <= 0 || nMonth > 12)
		ret = false;
	if(nDay <= 0)			//■要修正■面倒だから末日のチェックはしていない
		ret = false;
	if(nHour < 0 || nMonth > 24)		//24はまぁよしとしている
		ret = false;
	if(nMin < 0 || nMin > 60)			//60はまぁよしとしている
		ret = false;
	if(nSec < 0 || nSec > 60)			//60はまぁよしとしている
		ret = false;

	//グレゴリオ暦は1582年10月15日から始まっている
	if(nYear < 1582)
		ret = false;
	if(nYear == 1582 && nMonth < 10)
		ret = false;
	if(nYear == 1582 && nMonth == 10 && nDay < 15)
		ret = false;

	//ret == falseでも計算は続行する

	if(nMonth == 1 || nMonth == 2)
	{
		nMonth += 12;
		nYear--;
	}

	dJD = (double)((int)(nYear * 365.25) + (int)(nYear / 400) - (int)(nYear / 100) + (int)(30.59 * (nMonth - 2)) + nDay - 678912 + 2400000.5 + (double)nHour / 24 + (double)nMin / (24*60) + (double)nSec / (24*60*60));

	return	ret;
}


//
//	準ユリウス日の取得
//
//	年月日はグレゴリオ暦(普通の西暦)、時間はUTCで渡すこと
//
bool	GetMJD(double& dMJD,int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec)
{
	bool ret;

	ret = GetJD(dMJD,nYear,nMonth,nDay,nHour,nMin,nSec);
	dMJD = dJD + 2400000.5;

	return	ret;
}


カテゴリー「VC++ TIPS」 のエントリー