본문 바로가기
Study

Julian Day Number (율리우스 적일)

by 개발새-발 2025. 5. 8.
반응형

특정 일자로부터 경과한 일 수

우리는 일반적으로 날짜를 “2025년 5월 5일”과 같이 연, 월, 일로 표현한다. 하지만 D-day를 계산하거나 특정 날짜의 요일을 알고자 할 때는, 연·월·일 정보를 그대로 다루기보다, 기준일로부터 며칠이 경과했는지를 수치로 계산하는 것이 훨씬 편리하다.

예를 들어, 2025년 어린이날(5월 5일)과 크리스마스(12월 25일) 사이의 날짜 차이를 계산한다고 해 보자. 기준일을 2025년 1월 1일로 두었을 때, 어린이날은 124일째, 크리스마스는 358일째이다. 두 날짜의 차이는 단순히 358 - 124 = 234일이다.

또한 요일 계산도 쉽게 할 수 있다. 2025년 1월 1일이 수요일이고, 크리스마스가 그로부터 358일 후라면, 358 ÷ 7 = 51...1 이므로 1일 뒤인 목요일이 된다.

이처럼 절대 일수(JDN)로 변환하면 날짜 계산이 단순화된다.


JDN이란?

우리가 앞에서 살펴본 ‘경과 일 수’ 개념은 JDN(Julian Day Number, 율리우스 적일)과 연결된다. JDN은 기원전 4713년 1월 1일 (율리우스력 기준) 정오(12:00 UTC)부터 경과한 전체 날짜 수를 정수로 표현한 것이다.

이 기준일은 율리우스 주기(Julian Period)의 시작점인데, 7980년 주기로 정의된다. 이는 다음 세 가지 주기의 최소공배수이다:

  • 태양 순환기: 28년 (요일/윤년 주기 반복)
  • 메톤 주기: 19년 (태양-달력 정렬 주기)
  • 인디션(세금) 주기: 15년

JDN 계산법

JDN을 계산하는 공식은 여러 가지가 존재한다. 아래는 그레고리력(Gregorian Calendar)을 기준으로 JDN을 계산하는 대표적인 공식이다.

✅ int() 연산의 결과는 소수점 이하를 절삭(truncation)한 값이다.
이는 수학적 내림(floor)과는 다르며, 음수인 경우에도 0 방향으로 절삭된다.
예시: int(-3.8) = -3, floor(-3.8) = -4

출처: The Explanatory Supplement to the Astronomical Almanac (1992)

$$
\begin{align*}
JDN =& \operatorname{int}\left( \frac{1461 \cdot (Y + 4800 + \operatorname{int}(\frac{M-14}{12}))}{4} \right) \\
&+ \operatorname{int}\left( \frac{367 \cdot (M - 2 - 12 \cdot \operatorname{int}(\frac{M - 14}{12}))}{12} \right) \\
&- \operatorname{int}\left( \frac{3 \cdot \operatorname{int}(\frac{Y + 4900 + \operatorname{int}(\frac{M - 14}{12})}{100})}{4} \right) \\
&+ D - 32075
\end{align*}
$$

여기서 Y, M, D는 각각 연, 월, 일이다.

이 공식의 핵심은 1월과 2월을 13월, 14월로 간주해 전년도에 포함시키는 방식이다.
예를 들어, 2025년 1월과 2월은 각각 2024년의 13월과 14월로 계산된다.

식 중 int((M - 14) / 12)는 -1이 되어 이러한 처리를 자동으로 수행한다.

이를 기반으로 다음과 같이 더 단순한 형태로도 변환할 수 있다:

$$
\begin{align*}
JDN = & \operatorname{int}\left( \frac{1461 \cdot (Y' + 4800)}{4} \right) \\
&+ \operatorname{int}\left( \frac{367 \cdot (M' - 2)}{12} \right) \\
&- \operatorname{int}\left( \frac{3 \cdot \operatorname{int}(\frac{Y' + 4900}{100})}{4} \right) \\
&+ D - 32075
\end{align*}
$$

여기서:

  • M' = (M < 3) ? M + 12 : M
  • Y' = (M < 3) ? Y - 1 : Y

이 식의 구성 요소는 다음과 같다:

  • 1461(Y + 4800)/4: 연도에 따른 누적 일수
  • 367(M - 2)/12: 3월을 기준으로 한 월별 누적 일수

위 수식은 수치적으로 정확하지만, 그레고리력 이전의 날짜에는 직접 적용되지 않는다.
이를 보완하기 위해 프로렙틱 그레고리력(proleptic Gregorian calendar)을 사용하는 경우도 있다.


프로렙틱 그레고리력 기반 공식

그레고리력이 공식 도입되기 전(1582년 이전)의 날짜에도 동일한 윤년 규칙을 확장 적용하는 방식을 프로렙틱 그레고리력이라고 한다. 이 방식은 기원전 수천 년 전까지 일관된 방식으로 JDN을 계산할 수 있게 해준다.

다음 공식은 프로렙틱 그레고리력 기준으로 항상 유효하며, 특히 기원전 4800년 이전의 날짜까지 잘 작동한다.

$$
JD = D + \operatorname{int}\left( \frac{153 \cdot M - 457}{5} \right) + 365 \cdot Y + \left\lfloor \frac{Y}{4} \right\rfloor - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor \frac{Y}{400} \right\rfloor + 1721118.5
$$

사실 JDN은 정오를 기준으로 정해져 있어, 날짜가 변경되는 시점의 JD 값은 정수값 + 0.5 이다. 처음 알려준 식은 정오 기준으로 값을 반환한다. 이 식에서도 동일한 값을 사용하고자 한다면 상수항을 1721119로 수정하자.


파이썬 구현 예

def JDN1(year, month, day_of_month):
    if month < 3 :
        month += 12
        year -= 1

    return day_of_month \
            + int((153 * month - 457) / 5) \
            + 365 * year \
            + year // 4 \
            - year // 100 \
            + year // 400 \
            + 1721118.5

def JDN2(year, month, day_of_month):
    if month < 3 :
        month += 12
        year -= 1

    return int(1461 * (year + 4800) / 4) \
            + int(367 * (month - 2) / 12) \
            - int(3 * int((year + 4900) / 100) / 4) \
            + day_of_month \
            - 32075
print(JDN1(2025, 5, 5))  # 2460800.5
print(JDN2(2025, 5, 5))  # 2460801
반응형

'Study' 카테고리의 다른 글

프로그래밍 언어에서의 나눗셈과 나머지 연산 차이  (0) 2025.05.11

댓글