ジュリアン通日(Julian date)を求めるC関数

必要に迫られて作った“ジュリアン通日(Julian date)”変換関数(C言語)です。

long toJulianDate(int year, int month, int mday) {
  int a = (14 - month) / 12;
  int y = year + 4800 - a;
  int m = month + 12 * a - 3;
  return mday + y * 365 - 32045
              + int((153 * m + 2) / 5)
              + int(y / 4) - int (y / 100) + int (y / 400);
}

void toYMD(long jdate, int& year, int &month, int &mday) {
  int j = jdate + 32044;
  int g  = j / 146097;
  int dg = j % 146097;
  int c  = (dg / 36524 + 1) * 3 / 4;
  int dc = dg - c * 36524;
  int b  = dc / 1461;
  int db = dc % 1461;
  int a  = (db / 365 + 1) * 3 / 4;
  int da = db - a * 365;
  int y  = g * 400 + c * 100 + b * 4 + a;
  int m  = (da * 5 + 308) / 153 - 2;
  int d  = da - (m + 4) * 153 / 5 + 122;

  year  = y - 4800 + (m + 2) / 12;
  month = (m + 2) % 12 + 1;
  mday  = d + 1;
}

JulianDateの7の剰余から曜日も求められます。 7で割った余りが0→月曜日,1→火曜日,…,6→日曜日,になります。