Skip to content

Instantly share code, notes, and snippets.

@kmizumar
Created May 3, 2012 18:48
Show Gist options
  • Save kmizumar/2588059 to your computer and use it in GitHub Desktop.
Save kmizumar/2588059 to your computer and use it in GitHub Desktop.
日付関連
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++);
}
@kmizumar
Copy link
Author

kmizumar commented May 3, 2012

ユリウス日とは,-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 年に一回かならずうるう年が発生する.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment