Homeツェラーの公式ユリウス日

ユリウス通日

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

グレゴリオ暦とユリウス暦

グレゴリオ暦は現在の暦法で,400年につき97回の閏日が挿入される。
1月,2月を前年の13月,14月に置き換えた日付を Y年M月D日 とする。 グレゴリオ暦 0年3月1日 を0日目としたとき,グレゴリオ暦 Y年M月D日 までの日数を G(Y,M,D) とする。
ただし,1582年より前の日付はグレゴリオ暦の規則を過去にさかのぼって定めたものとする。 \[ G=365Y+\left \lfloor \frac{Y}{4}\right \rfloor -\left \lfloor \frac{Y}{100}\right \rfloor +\left \lfloor \frac{Y}{400}\right \rfloor +\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1 \]

ユリウス暦は以前の暦法で,4年につき1回の閏日が挿入される。
1月,2月を前年の13月,14月に置き換えた日付を Y年M月D日 とする。 ユリウス暦 0年3月1日 を0日目としたとき,ユリウス暦 Y年M月D日 までの日数を J(Y,M,D) とする。 \[ J=365Y+\left \lfloor \frac{Y}{4}\right \rfloor +\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1 \] ユリウス暦 1582年10月4日 の翌日はグレゴリオ暦 1582年10月15日 で,この日にユリウス暦からグレゴリオ暦に切り替えられた。
ユリウス暦で 0年3月1日 ~ 1582年10月4日 の日数は 578042 日,
グレゴリオ暦で 0年3月1日 ~ 1582年10月15日 の日数は 578041 日なので,
ユリウス暦 0年3月1日 の2日後はグレゴリオ暦 0年3月1日 である。

ユリウス暦グレゴリオ暦J 0.3.1G 0.3.1
1582年10月5日10月15日578043578041
1582年10月4日10月14日578042578040
200年3月1日3月1日7305073048
0年3月3日3月1日20
0年3月1日2月28日0−2

200年3月1日 ~ 300年2月28日 の期間では,ユリウス暦とグレゴリオ暦の日付が一致する。

ユリウス通日

ユリウス暦 紀元前4713年1月1日 正午(世界時)を0とする日数をユリウス日(JD; Julian Day)という。ユリウス日の小数部分で時刻を表せるようになっている。
Y=0は紀元前1年,Y=−1は紀元前2年,Y=−2は紀元前3年を表すことに注意すると,ユリウス暦 0年3月1日 ~ −4712年1月1日正子(午前0時)の日数は J(−4712,1,1)=J(−4713,13,1)=−1721118,正午の値は −1721117.5 になる。

ユリウス暦グレゴリオ暦J 0.3.1G 0.3.1JDMJD
2000年1月1日7304277304252451544.551544
1858年11月17日6788836788812400000.50
0年3月1日201721119.5
0年3月1日0−21721117.5
−4712年1月1日−1721117.5−1721119.50

ユリウス日から 2400000.5 を引いた日数を修正ユリウス日(MJD; Modified JD)という。 修正ユリウス日はグレゴリオ暦 1858年11月17日 正子を0とする日数になる。

1900日付システムと1904日付システム

EXCEL で使用できる日付システムに2種あり,1900日付システムは 1900年1月1日 を1日目とするシリアル値,1904日付システムは 1904年1月1日 を0日目とするシリアル値を使用する。 既定(デフォルト)では1900日付システムになっている。
1900日付システムは一部に問題があることが知られている。1900年は平年なので 2月29日 は存在しないが,1900日付システムではこの日付にシリアル値 60 が割り振られている。

日付1900日付1904日付G 0.3.1
2000年1月1日3652635064730425
1904年1月3日14642695363
1904年1月2日14631695362
1904年1月1日14620695361
1900年3月1日61-693960
1900年2月29日60--※ 存在しない日付
1900年2月28日59-693959
1900年1月3日3-693903
1900年1月2日2-693902
1900年1月1日1-693901

1900日付システムで 1900年1月1日 ~ 2月28日 の期間は結果が保証されない。
1900日付システムでは 1900年3月1日 に61日目から始まると考える。

UNIX時刻

UNIX時刻は,1970年1月1日 0時0分0秒(世界時)を0としたときの経過秒数である。 閏秒が挿入された場合は,UNIX時刻は1秒間停止する。

日付UNIX1904日付1900日付MJDG 0.3.1
2000年1月1日946684800350643652651544730425
1970年1月2日86400241082557040588719469
1970年1月1日0241072556940587719468
1904年1月1日0146216480695361
1900年3月1日6115079693960
1858年11月17日0678881

※ UNIX時刻は午前0時の値。

相互変換

修正ユリウス日を MJD,1900日付システムを EXCEL,UNIX時刻を UNIX とおく。 MJD,UNIX は世界時,EXCELは日本時で表されているとし,日本時の時差を Z=+9 とする。

UNIXとEXCEL: \begin{gather} \mathrm{UNIX}=86400(\mathrm{EXCEL}-25569)-3600Z\\ \mathrm{EXCEL}=\frac{\mathrm{UNIX}+3600Z}{86400}+25569 \end{gather}

UNIXとMJD: \begin{gather} \mathrm{UNIX}=86400(\mathrm{MJD}-40587)\\ \mathrm{MJD}=\frac{\mathrm{UNIX}}{86400}+40587 \end{gather}

EXCELとMJD: \begin{gather} \mathrm{EXCEL}=\mathrm{MJD}-15018+\frac{Z}{24}\\ \mathrm{MJD}=\mathrm{EXCEL}+15018-\frac{Z}{24} \end{gather}

次のページへ

1 2 3 4 5 6 7 Next

日数と月数の変換

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

3月1日~M月1日の累計日数

1月,2月を前年の13月,14月に置き換えた日付をY年M月D日とする。
3月~7月の各月の日数は,31,30,31,30,31 で,その後も5か月を周期に変化している。最後の14月(2月)は例外で不規則になっている。

3月 4月 5月 6月 7月 8月 9月 10月11月12月13月14月
日数313031303131303130313128

3月1日が0日目のとき,M月1日までの累計の日数を R とすると,M と R の対応は表のとおり。

月(M)3月1日4月1日5月1日6月1日7月1日8月1日
日数3130313031
累計(R)0316192122153

M を5だけ増加させると,R は153だけ増加するから,R は 153(M−3)/5 にほぼ等しい。 \[ R\approx \frac{153(M-3)}{5} \] M から R を求める公式を次のように設定する。
ここで,⌊ ⌋ は1に満たない端数を切り捨てる関数(床関数)である。 \[ R=\left \lfloor \frac{153(M-3)+c}{5}\right \rfloor \] すべての月でうまく求められるように c の値を調整していく。
M=3 のとき,R=0 になるような c の範囲は 0≤c<5,
M=4 のとき,R=31 になるような c の範囲は 2≤c<7,
M=5 のとき,R=61 になるような c の範囲は −1≤c<4,
M=6 のとき,R=92 になるような c の範囲は 1≤c<6,
M=7 のとき,R=122 になるような c の範囲は −2≤c<3 なので,
すべての月でうまく求められる c の範囲は 2≤c<3 である。整数なら c=2 に決まる。 \[ R=\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor \tag{1} \]

累計日数から月を求める公式

今度は,逆変換を考える。

累計(R)0~30   31~60  61~91  92~121 122~152
月(M)3月4月5月6月7月

R を153だけ増加させると,M は5だけ増加するから,M−3 は 5R/153 にほぼ等しい。 \[ M-3\approx \frac{5R}{153} \] R から M を求める公式を次のように設定する。 \[ M=\left \lfloor \frac{5R+c}{153}\right \rfloor +3 \] すべての月でうまく求められるように c の値を調整していく。
R が 0~30 のとき,M=3 になるような c の範囲は 0≤c<3,
R が 31~60 のとき,M=4 になるような c の範囲は −2≤c<6,
R が 61~91 のとき,M=5 になるような c の範囲は 1≤c<4,
R が 92~121 のとき,M=6 になるような c の範囲は −1≤c<7,
R が 122~152 のとき,M=7 になるような c の範囲は 2≤c<5 なので,
すべての月でうまく求められる c の範囲は 2≤c<3 である。整数なら c=2 に決まる。 \[ M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3 \tag{2} \]

累計日数から月・日を求める公式

3月1日が0日目のとき,M月D日までの累計の日数を R とし,
R の範囲は,平年なら 0~364,閏年なら 0~365 とする。
日数 R が与えられているとき,M は次の式で求められる。 \[ M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3 \] R を 3月1日~M月1日 の日数と M月1日~M月D日 の日数の和に分ける。
3月1日~M月1日 の日数は ⌊(153(M−3)+2)/5⌋,M月1日~M月D日 の日数は D−1 だから, \[ R=\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1 \] これを解くと,D が求められる。 \[ D=R-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +1 \tag{3} \]

次のページへ

1 2 3 4 5 6 7 Next

日付変換(記数法としての日付)

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

十進法から他の進法への変換

十進法では,一の位,十の位,百の位,千の位等が設定されるが,八進法では,1の位,8の位,64の位,512の位等が設定される。
十進法で 751 と表される数は次のような手順を経て,八進法に変換することができる。

751 を512で割ると,商は Q=1,余りは R=239,
その余り 239 を64で割ると,商は Q=3,余りは R=47,
その余り 47 を8で割ると,商は Q=5,余りは R=7,
その余り 7 を1で割ると,商は Q=7,余りは R=0 になる。

除算QR
751 ÷ 5121239
239 ÷ 64347
47 ÷ 857
7 ÷ 170

求めた商を順に並べることにより,八進法の表記 "1357" が得られる。
反対に,八進法表記 "1357" の各位に 512,64,8,1 の重みを付けて総和を求めると,十進法の値 751 が得られる。 \[ 512\times 1+64\times 3+8\times 5+1\times 7=751 \]

記数法の考え方は日付の決定のために応用できる。

400年,100年,4年,1年の日数

グレゴリオ暦の400年は 146097 日,100年は 36524 または 36525 日,4年は 1461 または 1460 日,1年は 365 または 366 日である。

単位日数例外
400年146097例外なし
100年36524+1400年ごとの閏日を含むときは1日増
4年1461−1100年ごとの閏日でない2月末日を含むときは1日減
1年365+1閏日を含むときは1日増

グレゴリオ暦の日数を日付に変換する方法1(記数法からのアナロジー)

グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とする。
G を次のように分解する。 \begin{align} &Q_\mathrm{CD}=\left \lfloor \frac{G}{146097}\right \rfloor , &&R_\mathrm{CD}=G-146097Q_\mathrm{CD}\\ &Q_\mathrm{C}=\min \left(3,\left \lfloor \frac{R_\mathrm{CD}}{36524}\right \rfloor \right), &&R_\mathrm{C}=R_\mathrm{CD}-36524Q_\mathrm{C}\\ &Q_\mathrm{IV}=\left \lfloor \frac{R_\mathrm{C}}{1461}\right \rfloor , &&R_\mathrm{IV}=R_\mathrm{C}-1461Q_\mathrm{IV}\\ &Q_\mathrm{I}=\min \left(3,\left \lfloor \frac{R_\mathrm{IV}}{365}\right \rfloor \right), &&R_\mathrm{I}=R_\mathrm{IV}-365Q_\mathrm{I} \end{align} これより Y が \[ Y=400Q_\mathrm{CD}+100Q_\mathrm{C}+4Q_\mathrm{IV}+Q_\mathrm{I} \] さらに M,D が決定できる。 \begin{align} &M=\left \lfloor \frac{5R_\mathrm{I}+2}{153}\right \rfloor +3, &&D=R_\mathrm{I}-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +1 \end{align}

ユリウス暦の日数を日付に変換する方法1(記数法からのアナロジー)

ユリウス暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を J とする。
J を次のように分解する。 \begin{align} &Q_\mathrm{IV}=\left \lfloor \frac{J}{1461}\right \rfloor , &&R_\mathrm{IV}=J-1461Q_\mathrm{IV}\\ &Q_\mathrm{I}=\min \left(3,\left \lfloor \frac{R_\mathrm{IV}}{365}\right \rfloor \right), &&R_\mathrm{I}=R_\mathrm{IV}-365Q_\mathrm{I} \end{align} これより Y が \[ Y=4Q_\mathrm{IV}+Q_\mathrm{I} \] さらに M,D が決定できる。 \begin{align} &M=\left \lfloor \frac{5R_\mathrm{I}+2}{153}\right \rfloor +3, &&D=R_\mathrm{I}-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +1 \end{align}

次のページへ

1 2 3 4 5 6 7 Next

日付変換(除算の省略)

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

アルゴリズムの改良

前ページでは,100年単位の商と余りを次のような手順で求めた。 \begin{align} &Q_\mathrm{CD}=\left \lfloor \frac{G}{146097}\right \rfloor , &&R_\mathrm{CD}=G-146097Q_\mathrm{CD}\\ &Q_\mathrm{C}=\min \left(3,\left \lfloor \frac{R_\mathrm{CD}}{36524}\right \rfloor \right), &&R_\mathrm{C}=R_\mathrm{CD}-36524Q_\mathrm{C}\\ \end{align} この間に2回の除算が行われているが,1回に減らすことが可能である。
100年単位の商 QC は次のようにして求めることもできる。 \[ Q_\mathrm{C}=\left \lfloor \frac{4R_\mathrm{CD}+3}{146097}\right \rfloor =\begin{cases} 0 &0\le R_\mathrm{CD}\le 36523\\ 1 &36524\le R_\mathrm{CD}\le 73047\\ 2 &73048\le R_\mathrm{CD}\le 109571\\ 3 &109572\le R_\mathrm{CD}\le 146096 \end{cases} \] QC から RCD を消去して G に置き換える。 \[ Q_\mathrm{C}=\left \lfloor \frac{4(G-146097Q_\mathrm{CD})+3}{146097}\right \rfloor =\left \lfloor \frac{4G+3}{146097}\right \rfloor-4Q_\mathrm{CD} \] YC=4QCD+QC とおき,逆に,QCD と QC を YC で表す。 \begin{gather} Y_\mathrm{C}=4Q_\mathrm{C}+Q_\mathrm{C}=\left \lfloor \frac{4G+3}{146097}\right \rfloor \\ Q_\mathrm{CD}=\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor ,\qquad Q_\mathrm{C}=Y_\mathrm{C}-4\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor \end{gather} RC は次のように置き換えられる。 \begin{align} R_\mathrm{C}&=G-146097Q_\mathrm{CD}-36524Q_\mathrm{C}\\ &=G-36524\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor -36524\left(Y_\mathrm{C}-4\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor \right)\\ \end{align} したがって,100年単位の商と余りを求めるための2回分の除算は,1回で済ませられる。 \[ Y_\mathrm{C}=\left \lfloor \frac{4G+3}{146097}\right \rfloor ,\qquad R_\mathrm{C}=G-36524Y_\mathrm{C}-\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor \] 同様にすると,1年単位の商と余りを求めるための2回分の除算は,1回で済ませられる。 \[ Y_\mathrm{I}=\left \lfloor \frac{4R_\mathrm{C}+3}{1461}\right \rfloor ,\qquad R_\mathrm{I}=R_\mathrm{C}-365Y_\mathrm{I}-\left \lfloor \frac{Y_\mathrm{I}}{4}\right \rfloor \] このときの Y は 100YC+YI になる。 \[ Y=100(4Q_\mathrm{CD}+Q_\mathrm{C})+(4Q_\mathrm{IV}+Q_\mathrm{I}) =100Y_\mathrm{C}+Y_\mathrm{I} \]

グレゴリオ暦の日数を日付に変換する方法(2)

グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とする。
G を次のように分解する。 \begin{align} &Y_\mathrm{C}=\left \lfloor \frac{4G+3}{146097}\right \rfloor , &&R_\mathrm{C}=G-36524Y_\mathrm{C}-\left \lfloor \frac{Y_\mathrm{C}}{4}\right \rfloor \\ &Y_\mathrm{I}=\left \lfloor \frac{4R_\mathrm{C}+3}{1461}\right \rfloor , &&R_\mathrm{I}=R_\mathrm{C}-365Y_\mathrm{I}-\left \lfloor \frac{Y_\mathrm{I}}{4}\right \rfloor \end{align} これより Y が \[ Y=100Y_\mathrm{C}+Y_\mathrm{I} \] さらに M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R_\mathrm{I}+2}{153}\right \rfloor +3,\qquad D=R_\mathrm{I}-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +1 \end{gather}

ユリウス暦の日数を日付に変換する方法(2)

ユリウス暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を J とする。
J を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{4J+3}{1461}\right \rfloor , &&R=J-365Y-\left \lfloor \frac{Y}{4}\right \rfloor \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=R-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +1 \end{gather}

サンプルプログラム

SET コマンドを使ったサンプルを示す。強調部分で負の数による不具合を修正している。

@echo off
setlocal
set /p G=G=
set /a "G|=0"
echo G=%G%
set /a Q=G/146097
if %G% lss 0 set /a Q−=1
set /a G−=Q∗146097
set /a YY=(G∗4+3)/146097
set /a RR=G−YY∗36524−YY/4
set /a Y=(RR∗4+3)/1461
set /a R=RR−Y∗365−Y/4
set /a Y+=YY∗100
set /a M=(R∗5+2)/153+3
set /a D=R−((M−3)∗153+2)/5+1
set /a Y+=Q∗400
if %M% gtr 12 set /a M−=12, Y+=1
echo Y=%Y%, M=%M%, D=%D%

計算例

2001年問題

UNIX時刻が 1000000000 になる日付と時刻を求める。 0年3月1日からの日数を G とすると \begin{align} G &=\frac{\mathrm{UNIX}}{86400}+719468\\ &=\frac{1000000000}{86400}+719468\\ &=731042+\frac{1}{24}+\frac{46}{1440}+\frac{40}{86400} \end{align} 時刻は1時46分40秒(世界時)で,日数の整数部分は ⌊G⌋=731042 である。
100年単位の商 YC と余り RC, \[ Y_\mathrm{C}=\left \lfloor \frac{4\times 731042+3}{146097}\right \rfloor =20,\qquad R_\mathrm{C}=731042-36524\times 20-\left \lfloor \frac{20}{4}\right \rfloor =557 \] 1年単位の商 YI と余り RI を求めると, \[ Y_\mathrm{I}=\left \lfloor \frac{4\times 557+3}{1461}\right \rfloor =1,\qquad R_\mathrm{I}=557-365\times 1-\left \lfloor \frac{1}{4}\right \rfloor =192 \] Y が決まり, \[ Y=100\times 20+1=2001 \] さらに M と D を求める。 \[ M=\left \lfloor \frac{5\times 192+2}{153}\right \rfloor +3=9,\qquad D=192-\left \lfloor \frac{153\times (9-3)+2}{5}\right \rfloor +1=9 \] UNIX時刻が 1000000000 になるのは 2001年9月9日 1時46分40秒 である。

2038年問題

UNIX時刻が 2147483647 になる日付と時刻を求める。 0年3月1日からの日数を G とすると \begin{align} G &=\frac{\mathrm{UNIX}}{86400}+719468\\ &=\frac{2147483647}{86400}+719468\\ &=744323+\frac{3}{24}+\frac{14}{1440}+\frac{7}{86400} \end{align} 時刻は3時14分7秒(世界時)で,日数の整数部分は ⌊G⌋=744323 である。
100年単位の商 YC と余り RC, \[ Y_\mathrm{C}=\left \lfloor \frac{4\times 744323+3}{146097}\right \rfloor =20,\qquad R_\mathrm{C}=744323-36524\times 20-\left \lfloor \frac{20}{4}\right \rfloor =13838 \] 1年単位の商 YI と余り RI を求めると, \[ Y_\mathrm{I}=\left \lfloor \frac{4\times 13838+3}{1461}\right \rfloor =37,\qquad R_\mathrm{I}=13838-365\times 37-\left \lfloor \frac{37}{4}\right \rfloor =324 \] Y が決まり, \[ Y=100\times 20+37=2037 \] さらに M と D を求める。 \[ M=\left \lfloor \frac{5\times 324+2}{153}\right \rfloor +3=13,\qquad D=324-\left \lfloor \frac{153\times (13-3)+2}{5}\right \rfloor +1=19 \] UNIX時刻が 2147483647 になるのは 2038年1月19日 3時14分7秒 である。

次のページへ

1 2 3 4 5 6 7 Next

日付変換(余りの改良)

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

日付から日数を求める公式

1月,2月を前年の13月,14月に置き換えた日付を Y年M月D日 とする。 グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とすると,G は次の公式で求めることができる。 \[ G=365Y+\left \lfloor \frac{Y}{4}\right \rfloor -\left \lfloor \frac{Y}{100}\right \rfloor +\left \lfloor \frac{Y}{400}\right \rfloor +\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1 \] Y を100で割った商を C,余りを I,つまり Y=100C+I とすると,次のことが成り立つ。 \begin{align} &365Y=36500C+365I, &&\left \lfloor \frac{Y}{4}\right \rfloor =25C+\left \lfloor \frac{I}{4}\right \rfloor ,\\ &\left \lfloor \frac{Y}{100}\right \rfloor =C, &&\left \lfloor \frac{Y}{400}\right \rfloor =\left \lfloor \frac{C}{4}\right \rfloor \end{align} 日数 G を求める公式は次のように変形できる。 \begin{align} G &=36524C+\left \lfloor \frac{C}{4}\right \rfloor +365I+\left \lfloor \frac{I}{4}\right \rfloor +\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1\\ G &=\left \lfloor \frac{146097C}{4}\right \rfloor +\left \lfloor \frac{1461I}{4}\right \rfloor +\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +D-1 \end{align}

100年単位の余りの改良

0年3月1日 ~ Y年M月D日 の日数を G とし,100年単位の余りを RC とする。RC の範囲は0年以上100年未満の日数になる。 \[ G=\left \lfloor \frac{146097C}{4}\right \rfloor +R_\mathrm{C} \] ⌊146097C/4⌋ の部分に注目する。 C を4だけ増加させると,⌊146097C/4⌋ は146097だけ増加するから,C は 4G/146097 にほぼ等しい。 \[ C\approx \frac{4G}{146097} \] 端数をうまく調整すると,C は 4G+3 を146097で割った商で表せる。 \[ C=\left \lfloor \frac{4G+3}{146097}\right \rfloor \] 次に,4G+3 を146097で割った余りを求める。余りを (4G+3)%146097 と表す。 \begin{align} (4G+3)\mathop{\%}146097 &=(4G+3)-146097C\\ &=4\left(36524C+\left \lfloor \frac{C}{4}\right \rfloor +R_\mathrm{C}\right)+3-146097C\\ &=4R_\mathrm{C}+3-\left(C-4\left \lfloor \frac{C}{4}\right \rfloor \right)\\ \frac{(4G+3)\mathop{\%}146097}{4} &=R_\mathrm{C}+\frac{3}{4}-\left(\frac{C}{4}-\left \lfloor \frac{C}{4}\right \rfloor \right) \end{align} C は整数なので,上の式の括弧内は 0 以上 3/4 以下である。
したがって100年単位の余りは次のように表せる。 \[ R_\mathrm{C}=\left \lfloor \frac{(4G+3)\mathop{\%}146097}{4}\right \rfloor \]

1年単位の余りの改良

同様にして,1年単位の余りを RI とする。RI の範囲は0年以上1年未満の日数になる。 \[ R_\mathrm{C}=\left \lfloor \frac{1461I}{4}\right \rfloor +R_\mathrm{I} \] I は 4RC+3 を1461で割った商で表せる。 \[ I=\left \lfloor \frac{4R_\mathrm{C}+3}{1461}\right \rfloor \] 1年単位の余り RI は次のように表せる。 \[ R_\mathrm{I}=\left \lfloor \frac{(4R_\mathrm{C}+3)\mathop{\%}1461}{4}\right \rfloor \]

1か月単位の余りの改良

1か月単位の余りを RM とする。RM の範囲は0か月以上1か月未満の日数になる。 \[ R_\mathrm{I}=\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +R_\mathrm{M} \] ⌊(153(M−3)+2)/5⌋ の部分に注目する。 M を5だけ増加させると,⌊(153(M−3)+2)/5⌋ は153だけ増加するから,M−3 は 5RI/153 にほぼ等しい。 \[ M-3\approx \frac{5R_\mathrm{I}}{153} \] 端数をうまく調整すると,M は 5RI+2 を153で割った商で表せる。 \[ M=\left \lfloor \frac{5R_\mathrm{I}+2}{153}\right \rfloor +3 \] 次に,5RI+2 を153で割った余りを求める。 \begin{align} (5R_\mathrm{I}+2)\mathop{\%}153 &=(5R_\mathrm{I}+2)-153(M-3)\\ &=5\left(\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor +R_\mathrm{M}\right)+2-153(M-3)\\ &=5R_\mathrm{M}+2-\left(153(M-3)-5\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor \right)\\ \frac{(5R_\mathrm{I}+2)\mathop{\%}153}{5} &=R_\mathrm{M}+\frac{4}{5}-\left(\frac{153(M-3)+2}{5}-\left \lfloor \frac{153(M-3)+2}{5}\right \rfloor \right) \end{align} M は整数なので,上の式の括弧内は 0 以上 4/5 以下である。
したがって1か月単位の余りは次のように表せる。 \[ R_\mathrm{M}=\left \lfloor \frac{(5R_\mathrm{I}+2)\mathop{\%}153}{5}\right \rfloor \]

最後に,この余り RM は D−1 に等しいから,D も決まる。 \[ D=\left \lfloor \frac{(5R_\mathrm{I}+2)\mathop{\%}153}{5}\right \rfloor+1 \]

グレゴリオ暦の日数を日付に変換する方法(3)

グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とする。
G を次のように分解する。 \begin{align} &Y_\mathrm{C}=\left \lfloor \frac{4G+3}{146097}\right \rfloor , &&R_\mathrm{C}=\left \lfloor \frac{(4G+3)\mathop{\%}146097}{4}\right \rfloor \\ &Y_\mathrm{I}=\left \lfloor \frac{4R_\mathrm{C}+3}{1461}\right \rfloor , &&R_\mathrm{I}=\left \lfloor \frac{(4R_\mathrm{C}+3)\mathop{\%}1461}{4}\right \rfloor \end{align} これより Y が \[ Y=100Y_\mathrm{C}+Y_\mathrm{I} \] さらに M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R_\mathrm{I}+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R_\mathrm{I}+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather}

ユリウス暦の日数を日付に変換する方法(3)

ユリウス暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を J とする。
J を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{4J+3}{1461}\right \rfloor , &&R=\left \lfloor \frac{(4J+3)\mathop{\%}1461}{4}\right \rfloor \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather}

次のページへ

1 2 3 4 5 6 7 Next

日付変換(暦の読み替え)

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

グレゴリオ暦をユリウス暦に読み替える

ユリウス暦では400年につき100回の閏日(2月29日)が挿入されるのに対して,グレゴリオ暦では97回であり,これらの暦を比べると,400年につき3日の日数差がある。

G(4G+3)/146097−G/146097 J−G
0 ~ 365230−00
36524 ~ 730471−01
73048 ~ 1095712−02
109572 ~ 1460963−03
146097 ~ 1826204−13
182621 ~ 2191445−14
219145 ~ 2556686−15
255669 ~ 2921937−16

グレゴリオ暦の日数 G に,100年に1日,⌊(4G+3)/146097⌋ 日を加え, 400年に1日,⌊G/146097⌋ 日を差し引けば,ユリウス暦の日数 J に変換できる。 \[ J=G+\left \lfloor \frac{4G+3}{146097}\right \rfloor -\left \lfloor \frac{G}{146097}\right \rfloor \] あるいは \[ J=G+\left \lfloor \frac{3}{4}\left \lfloor \frac{4G+3}{146097}+1\right \rfloor \right \rfloor \] でもよい。

ユリウス暦の日数を日付に変換する方法(3)

ユリウス暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を J とする。
J を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{4J+3}{1461}\right \rfloor , &&R=\left \lfloor \frac{(4J+3)\mathop{\%}1461}{4}\right \rfloor \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather} これは前ページの公式と同じである。

グレゴリオ暦の日数を日付に変換する方法(4)

グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とする。
グレゴリオ暦の日数 G をユリウス暦の日数 J に読み替えてから, \[ J=G+\left \lfloor \frac{3}{4}\left \lfloor \frac{4G+3}{146097}+1\right \rfloor \right \rfloor \] J を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{4J+3}{1461}\right \rfloor , &&R=\left \lfloor \frac{(4J+3)\mathop{\%}1461}{4}\right \rfloor \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather} これは Wikipedia に書かれている公式と実質的に同等である。

※ Wikipedia では 4G+3 の部分が 4(G+1) で計算されているが結果に影響はない。

次のページへ

1 2 3 4 5 6 7 Next

日付変換(1年を366日に)

1. ユリウス通日
2. 日数と月数の変換
3. 日付変換(記数法として)
4. 日付変換(除算の省略)
5. 日付変換(余りの改良)
6. 日付変換(暦の読み替え)
7. 日付変換(1年を366日に)

1年を366日に読み替える

グレゴリオ暦 0年3月1日 ~ Y年M月D日 の日数を G,ユリウス暦 0年3月1日 ~ Y年M月D日 の日数を J とすると, G から J に,次の変換式で読み替えができる。 \[ J=G+\left \lfloor \frac{4G+3}{146097}\right \rfloor -\left \lfloor \frac{G}{146097}\right \rfloor ,\qquad J=G+\left \lfloor \frac{3}{4}\left \lfloor \frac{4G+3}{146097}+1\right \rfloor \right \rfloor \]

閏日が挿入されたりされなかったりする不規則をなくして,1年がつねに366日になる暦に替えた場合の日数を L とする。

J(4J+3)/1461−J/1461 L−J
0 ~ 3640−00
365 ~ 7291−01
730 ~ 10942−02
1095 ~ 14603−03
1461 ~ 18254−13
1826 ~ 21905−14
2191 ~ 25556−15
2556 ~ 29217−16

ユリウス暦の日数 J に,1年に1日,⌊(4J+3)/1461⌋ 日を加え, 4年に1日,⌊J/1461⌋ 日を差し引けば,毎年が366日の暦の日数 L に変換できる。 \[ L=J+\left \lfloor \frac{4J+3}{1461}\right \rfloor -\left \lfloor \frac{J}{1461}\right \rfloor \] あるいは \[ L=J+\left \lfloor \frac{3}{4}\left \lfloor \frac{4J+3}{1461}+1\right \rfloor \right \rfloor \] でもよい。

ユリウス暦の日数を日付に変換する方法(4)

ユリウス暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を J とする。
ユリウス暦の日数 J を1年が366日の暦の日数 L に読み替える。 \[ L=J+\left \lfloor \frac{3}{4}\left \lfloor \frac{4J+3}{1461}+1\right \rfloor \right \rfloor \] L を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{L}{366}\right \rfloor , &&R=L\mathop{\%}366 \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather}

グレゴリオ暦の日数を日付に変換する方法(5)

グレゴリオ暦 0年3月1日 を0日目として,0年3月1日 ~ Y年M月D日 の日数を G とする。
グレゴリオ暦の日数 G をユリウス暦の日数 J に読み替え,さらに1年が366日の暦の日数 L に読み替える。 \[ J=G+\left \lfloor \frac{3}{4}\left \lfloor \frac{4G+3}{146097}+1\right \rfloor \right \rfloor ,\qquad L=J+\left \lfloor \frac{3}{4}\left \lfloor \frac{4J+3}{1461}+1\right \rfloor \right \rfloor \] L を次のように分解する。 \begin{align} &Y=\left \lfloor \frac{L}{366}\right \rfloor , &&R=L\mathop{\%}366 \end{align} これより M,D が決定できる。 \begin{gather} M=\left \lfloor \frac{5R+2}{153}\right \rfloor +3,\qquad D=\left \lfloor \frac{(5R+2)\mathop{\%}153}{5}\right \rfloor +1 \end{gather}

サンプルプログラム

SET コマンドを使ったサンプルを示す。強調部分で負の数による不具合を修正している。

@echo off
setlocal
set /p G=G=
set /a "G|=0"
echo G=%G%
set /a Q=G/146097
if %G% lss 0 set /a Q−=1
set /a G−=Q∗146097
set /a J=G+((G∗4+3)/146097+1)∗3/4
set /a L=J+((J∗4+3)/1461+1)∗3/4
set /a Y=L/366
set /a R=L%%366∗5+2
set /a M=R/153+3
set /a D=R%%153/5+1
set /a Y+=Q∗400
if %M% gtr 12 set /a M−=12, Y+=1
echo Y=%Y%, M=%M%, D=%D%

計算例

2001年問題

UNIX時刻が 1000000000 になる日付と時刻を求める。 0年3月1日からの日数を G とすると \begin{align} G &=\frac{\mathrm{UNIX}}{86400}+719468\\ &=\frac{1000000000}{86400}+719468\\ &=731042+\frac{1}{24}+\frac{46}{1440}+\frac{40}{86400} \end{align} 時刻は1時46分40秒(世界時)で,日数の整数部分は ⌊G⌋=731042 である。
⌊G⌋ を J に読み替え,J を L に読み替える。 \begin{align} J &=731042+\left \lfloor \frac{3}{4}\left \lfloor \frac{4\times 731042+3}{146097}+1\right \rfloor \right \rfloor =731042+15=731057\\ L &=731057+\left \lfloor \frac{3}{4}\left \lfloor \frac{4\times 731057+3}{1461}+1\right \rfloor \right \rfloor =731057+1501=732558 \end{align} Y と R を求め, \begin{gather} Y=\left \lfloor \frac{732558}{366}\right \rfloor =2001,\qquad R=732558\mathop{\%}366=192 \end{gather} M と D を求める。 \begin{gather} 5R+2=5\times 192+2=962\\ M=\left \lfloor \frac{962}{153}\right \rfloor +3=9,\qquad D=\left \lfloor \frac{962\mathop{\%}153}{5}\right \rfloor +1=9 \end{gather} UNIX時刻が 1000000000 になるのは 2001年9月9日 1時46分40秒 である。

2038年問題

UNIX時刻が 2147483647 になる日付と時刻を求める。 0年3月1日からの日数を G とすると \begin{align} G &=\frac{\mathrm{UNIX}}{86400}+719468\\ &=\frac{2147483647}{86400}+719468\\ &=744323+\frac{3}{24}+\frac{14}{1440}+\frac{7}{86400} \end{align} 時刻は3時14分7秒(世界時)で,日数の整数部分は ⌊G⌋=744323 である。
⌊G⌋ を J に読み替え,J を L に読み替える。 \begin{align} J &=744323+\left \lfloor \frac{3}{4}\left \lfloor \frac{4\times 744323+3}{146097}+1\right \rfloor \right \rfloor =744323+15=744338\\ L &=744338+\left \lfloor \frac{3}{4}\left \lfloor \frac{4\times 744338+3}{1461}+1\right \rfloor \right \rfloor =744338+1528=745866 \end{align} Y と R を求め, \begin{gather} Y=\left \lfloor \frac{745866}{366}\right \rfloor =2037,\qquad R=745866\mathop{\%}366=324 \end{gather} M と D を求める。 \begin{gather} 5R+2=5\times 324+2=1622\\ M=\left \lfloor \frac{1622}{153}\right \rfloor +3=13,\qquad D=\left \lfloor \frac{1622\mathop{\%}153}{5}\right \rfloor +1=19 \end{gather} UNIX時刻が 2147483647 になるのは 2038年1月19日 3時14分7秒 である。

最後のページです

1 2 3 4 5 6 7 Home

ユリウス日とエポック

Homeツェラーの公式ユリウス日

2015.11.8 作成 / 2021.2.2 更新

Home › ユリウス日