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.1 | G 0.3.1 | |
1582年 | 10月5日 | 10月15日 | 578043 | 578041 |
1582年 | 10月4日 | 10月14日 | 578042 | 578040 |
200年 | 3月1日 | 3月1日 | 73050 | 73048 |
0年 | 3月3日 | 3月1日 | 2 | 0 |
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.1 | G 0.3.1 | JD | MJD |
2000年1月1日 | 730427 | 730425 | 2451544.5 | 51544 | |
1858年11月17日 | 678883 | 678881 | 2400000.5 | 0 | |
0年3月1日 | 2 | 0 | 1721119.5 | ||
0年3月1日 | 0 | −2 | 1721117.5 | ||
−4712年1月1日 | −1721117.5 | −1721119.5 | 0 |
ユリウス日から 2400000.5 を引いた日数を修正ユリウス日(MJD; Modified JD)という。 修正ユリウス日はグレゴリオ暦 1858年11月17日 正子を0とする日数になる。
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日 | 36526 | 35064 | 730425 | |
1904年1月3日 | 1464 | 2 | 695363 | |
1904年1月2日 | 1463 | 1 | 695362 | |
1904年1月1日 | 1462 | 0 | 695361 | |
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時刻は,1970年1月1日 0時0分0秒(世界時)を0としたときの経過秒数である。 閏秒が挿入された場合は,UNIX時刻は1秒間停止する。
日付 | UNIX | 1904日付 | 1900日付 | MJD | G 0.3.1 |
2000年1月1日 | 946684800 | 35064 | 36526 | 51544 | 730425 |
1970年1月2日 | 86400 | 24108 | 25570 | 40588 | 719469 |
1970年1月1日 | 0 | 24107 | 25569 | 40587 | 719468 |
1904年1月1日 | 0 | 1462 | 16480 | 695361 | |
1900年3月1日 | 61 | 15079 | 693960 | ||
1858年11月17日 | 0 | 678881 |
※ 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. 日付変換(1年を366日に)
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月 | |||
日数 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 | 31 | 28 |
3月1日が0日目のとき,M月1日までの累計の日数を R とすると,M と R の対応は表のとおり。
月(M) | 3月1日 | 4月1日 | 5月1日 | 6月1日 | 7月1日 | 8月1日 |
日数 | 31 | 30 | 31 | 30 | 31 | |
累計(R) | 0 | 31 | 61 | 92 | 122 | 153 |
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. 日付変換(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 になる。
除算 | Q | R |
751 ÷ 512 | 1 | 239 |
239 ÷ 64 | 3 | 47 |
47 ÷ 8 | 5 | 7 |
7 ÷ 1 | 7 | 0 |
求めた商を順に並べることにより,八進法の表記 "1357" が得られる。
反対に,八進法表記 "1357" の各位に 512,64,8,1 の重みを付けて総和を求めると,十進法の値 751 が得られる。
\[
512\times 1+64\times 3+8\times 5+1\times 7=751
\]
記数法の考え方は日付の決定のために応用できる。
グレゴリオ暦の400年は 146097 日,100年は 36524 または 36525 日,4年は 1461 または 1460 日,1年は 365 または 366 日である。
単位 | 日数 | 例外 | |
400年 | 146097 | 例外なし | |
100年 | 36524 | +1 | 400年ごとの閏日を含むときは1日増 |
4年 | 1461 | −1 | 100年ごとの閏日でない2月末日を含むときは1日減 |
1年 | 365 | +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}
ユリウス暦 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. 日付変換(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}
\]
グレゴリオ暦 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}
ユリウス暦 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%
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秒 である。
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. 日付変換(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}
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年単位の余りを 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か月単位の余りを 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 \]
グレゴリオ暦 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}
ユリウス暦 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. 日付変換(1年を366日に)
ユリウス暦では400年につき100回の閏日(2月29日)が挿入されるのに対して,グレゴリオ暦では97回であり,これらの暦を比べると,400年につき3日の日数差がある。
G | (4G+3)/146097 | −G/146097 | J−G |
0 ~ 36523 | 0 | −0 | 0 |
36524 ~ 73047 | 1 | −0 | 1 |
73048 ~ 109571 | 2 | −0 | 2 |
109572 ~ 146096 | 3 | −0 | 3 |
146097 ~ 182620 | 4 | −1 | 3 |
182621 ~ 219144 | 5 | −1 | 4 |
219145 ~ 255668 | 6 | −1 | 5 |
255669 ~ 292193 | 7 | −1 | 6 |
グレゴリオ暦の日数 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 \] でもよい。
ユリウス暦 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}
これは前ページの公式と同じである。
グレゴリオ暦 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. 日付変換(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 ~ 364 | 0 | −0 | 0 |
365 ~ 729 | 1 | −0 | 1 |
730 ~ 1094 | 2 | −0 | 2 |
1095 ~ 1460 | 3 | −0 | 3 |
1461 ~ 1825 | 4 | −1 | 3 |
1826 ~ 2190 | 5 | −1 | 4 |
2191 ~ 2555 | 6 | −1 | 5 |
2556 ~ 2921 | 7 | −1 | 6 |
ユリウス暦の日数 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 \] でもよい。
ユリウス暦 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}
グレゴリオ暦 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%
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秒 である。
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秒 である。
最後のページです
2015.11.8 作成 / 2021.2.2 更新
Home › ユリウス日