【日 付からユリウス日の計算】
計算式は簡単です。
出典:Jean Meeus著 Astronomical Algorithms

・前段階
Y = 年(西暦)
M = 月
D = 日(日の小数として時間も含まれる)

月が3月未満(1月、2月)の場合
M = M + 12
Y = Y - 1

・JD計算

・ユリウス暦の修正
JDが2299160.5以下ならば、ユリウス暦となるから

とする。
※原著の式とは、若干形を変えているが意味は同じ。

・int[]関数
int[]は、[]内の整数部を取り出す関数

int[1.1] = 1
int[1.9] = 1
int[-1.1] = -2
int[-1.9] = -2

この様な値を返します。マイナス時の値に注意
C言語ならば、floor()関数です。

・プログラム
double julian(int nYear, int nMonth, double dDay)
{
    double da, db;
    double dJD;

    if (nMonth < 3){
        nMonth += 12;
        nYear--;
    }

    // Calc. body
    da = floor(nYear/100.0);
    db = 2.0 - da + floor(da / 4.0);
    dJD = floor(365.25 * nYear) + floor(30.6001 * (nMonth + 1)) + dDay + db + 1720994.5;

    if (dJD < 2299160.5){
        dJD -= db;
    }

    return dJD;
}



【ユリウス日から日付の計算】
こちらは若干面倒です。
出典:Jean Meeus著 Astronomical Algorithms

・前段階
JD=計算するユリウス日 + 0.5

IJD=int[JD]
FJD=JD - IJD
※ IJD FJDは、modf()関数とは、マイナス時の値が違うため使わない。

IJDが2299161.0以上(グレゴリオ暦)なら下の処理。


・計算部


・日付調整
Mが13以下なら 月=M - 1
それ以外なら  月=M - 13

月が3月以上なら 年=Y - 4716
それ以外なら  年=Y - 4715

日 = Day

・プログラム
void juian_date(double dJD, int *nYear, int *nMonth, double *dDay)
{
    int nY, nM;
    double da, db, dd;
    double dJDs = dJD + 0.5;
    double dJDi = floor(dJDs);
    double dJDf = dJDs - dJDi;
 
    if (dJDi > 2299160.0){
        da = floor((dJDi - 1867216.25) / 36524.25);
        dJDi += (1.0 + da - floor(da / 4.0));
    }

    db = dJDi + 1524.0;
    nY = (int)(floor((db - 122.1) / 365.25));
    dd = db - floor(nY * 365.25);
    nM = (int)(floor(dd / 30.6001));

    // Write Day
    *dDay = dd - floor(nM * 30.6001) + dJDf;

    // Write Month
    if (nM < 14){
        *nMonth = nM - 1;
    }else{
        *nMonth = nM - 13;
    }

    // Write Year
    if (*nMonth > 2){
        *nYear = nY - 4716;
    }else{
        *nYear = nY - 4715;
    }
}


【曜日の計算】
ユリウス日は連続した通日なので、
曜日の様な周期的な物は計算できる。
曜日なら7、十二支なら12で割った余りを求めれば良い。

・JDを日の単位にする
JDはお昼起点なので、0.5を加えて午前0時起点にし、
整数部だけにする。
JD = int[計算するユリウス日 + 0.5]
※ここでも int[-1.1] = -2を返す関数

・余り計算
nW = JD mod 7

・マイナス調整
JDがマイナスの場合、余りもマイナスになるので、
nW = nW + 7
の処理が必要。

・曜日との対応
7で割った余りだから、数字は0~6になる。
どの数字が何曜日になるかは、
曜日のわかっている日で試せば良いが、
上記通りの計算なら以下の表の通りになる。
0
1
2
3
4
5
6








・プログラム
int jd_week(double dJD)
{
    int nJD = (int)floor(dJD + 0.5);
    int nWeek = nJD % 7;
    if (nWeek < 0){
        nWeek += 7;
    }

    return nWeek;
}



前に戻る ユリウス日のプログラムへ
inserted by FC2 system