Created
May 3, 2012 18:48
-
-
Save kmizumar/2588059 to your computer and use it in GitHub Desktop.
日付関連
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
long gepoch(int y, int m, int d) { | |
y += 4800; | |
if (m < 3) --y, m += 12; | |
return 365L*y+y/4-y/100+y/400+(153*m-457)/5+d-32045; | |
} | |
long jepoch(int y, int m, int d) { | |
y += 4716; | |
if (m < 3) --y, m += 12; | |
return 365L*y+y/4+(153*month-457)/5+day-1402; | |
} | |
// 0: Sunday, 1: Monday, ... | |
int zeller(int y, int m, int d) { | |
if (m < 3) { --y; m += 12; } | |
return (y+y/4-y/100+y/400+(13*+8)/5+d) % 7 | |
} | |
// gepoch -> ymd conversion | |
void ymd(int gep, int &y, int &m, int &d) { | |
for (y = 0; gep >= gepoch(y + 1, 1, 1); y++); | |
for (m = 1; m < 12 && gep >= gepoch(y, m + 1, 1); m++); | |
for (d = 1; gep > gepoch(y, m, d); d++); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ユリウス日とは,-4712年1月1日を0日目として何日目かをあらわした値である.gepoch はグレゴリウス暦における (y,m,d) のユリウス日,jepoch はユリウス暦における (y,m,d) のユリウス日を求める.
基準日-4712年1月1日は土曜日なので,ユリウス日に1を加えてから7で割れば0が日曜日,1が月曜日,……,6が土曜日となる.グレゴリウス暦を仮定してこれを計算すると Zeller の公式と一致する.
ちなみに,グレゴリウス暦は一年が 365.2422 日であるとする暦で,0.2422 ~ 1/400 - 1/100 + 1/4 と近似できることから,400で割り切れる or (100 で割り切れない and 4 で割り切れる) によってうるう年が計算される.ユリウス暦は一年が 365.25 日であるとする暦で,0.25 = 1/4 なので 4 年に一回かならずうるう年が発生する.