Skip to content

이 날짜가 당신의 코드를 충돌시킬 것입니다

Ruby에서 런타임 오류를 발생시키는 기이하게도 특정 날짜를 발견하세요. 이것은 버그가 아닙니다. 언어의 소스 코드에 직접 내장된 440년 된 역사 수업입니다.

Stork.AI
Hero image for: 이 날짜가 당신의 코드를 충돌시킬 것입니다
💡

요약 / 핵심 포인트

Ruby에서 런타임 오류를 발생시키는 기이하게도 특정 날짜를 발견하세요. 이것은 버그가 아닙니다. 언어의 소스 코드에 직접 내장된 440년 된 역사 수업입니다.

사실은 역사 수업인 버그

1582년 10월의 특정 날짜를 파싱하려는 Ruby 코드에서 흥미로운 `ArgumentError`가 발생하여 코드를 멈출 수 있습니다. 개발자들은 `Date.parse("October 9th, 1582")`가 설명할 수 없이 충돌할 때 이를 접할 수 있으며, 이는 언어의 시간 처리 기능에 근본적인 결함이 있음을 시사합니다. 하지만 이것은 버그가 아니라 의도적이고 역사적으로 정확한 설계입니다.

Ruby의 소스 코드를 깊이 파고들면 `Date::ITALY` 상수를 발견할 수 있습니다. 이 겉보기에 임의적인 정수는 사실 1582년 10월 15일을 나타내는 정확한 율리우스일 번호입니다. 이 날짜는 무작위가 아니며, 전 세계 시간 측정에 있어 중요한 순간을 나타냅니다.

이 날, Pope Gregory XIII의 지휘 아래 이탈리아, 스페인, 폴란드는 고대 Julian calendar에서 더 정확한 Gregorian calendar로 공식적으로 전환했습니다. Julian calendar 시스템의 부정확한 윤년 규칙으로 인해 수세기 동안 축적된 오차를 바로잡기 위해 달력에서 10일이 단순히 삭제되었습니다. 1582년 10월 4일 목요일 다음 날은 1582년 10월 15일 금요일이었습니다.

Ruby의 `Date` 객체는 이 역사적 사건을 세심하게 반영합니다. `Date::ITALY`를 기본 초기화 경계로 사용하여 내부 계산을 동적으로 전환합니다. 1582년 10월 15일 이전 날짜는 Julian calendar 논리를 사용하여 처리되며, 그 이후 날짜는 Gregorian calendar 시스템을 따릅니다. 결과적으로, 1582년 10월 9일과 같은 날짜를 파싱하려고 하면 `ArgumentError`가 발생합니다. 왜냐하면 이 역사적으로 인식된 맥락에서 그 주는 문자 그대로 존재하지 않았기 때문입니다. 이러한 설계 선택은 잠재적인 런타임 오류를 달력 역사에 대한 흥미로운 교훈으로 바꿉니다.

달력에서 10일이 사라졌을 때

수세기 동안의 부정확성이 Julian calendar를 괴롭혔습니다. 4년마다 윤일을 추가하는 간단한 규칙은 약간 너무 관대하여 누적된 오차를 유발했습니다. 16세기까지 달력은 태양년과 약 10일 정도 어긋나 있었고, 부활절과 같은 종교적 휴일이 계절과 심각하게 불일치했습니다.

이 중대한 시간적 불일치를 수정하기 위해 Pope Gregory XIII는 1582년에 대대적인 개혁을 단행하여 Gregorian calendar를 도입했습니다. 그의 해결책은 과감했습니다. 그는 단순히 누적된 오차를 제거했습니다. 1582년 10월 4일 목요일 다음 날, 달력은 즉시 10월 15일 금요일로 넘어갔고, 이탈리아, 스페인, 폴란드와 같은 영향을 받은 지역에서 인류 역사에서 10일이 효과적으로 사라졌습니다.

Ruby의 `Date` 클래스는 기본적으로 이러한 역사적 불연속성을 존중합니다. 내부 엔진은 10일의 공백을 인식하여, 누락된 기간 내에 `Date` 객체를 인스턴스화하려는 모든 시도를 유효하지 않은 작업으로 간주합니다. 따라서 `Date.parse`를 사용하여 1582년 10월 9일과 같은 날짜를 조회하면 ArgumentError가 발생하며, 이는 코드의 관점에서 그 주가 결코 존재하지 않았음을 확인시켜 줍니다.

달력 혼란: 이탈리아만의 문제가 아니었다

이탈리아만이 달력 문제에 직면한 것은 아니었습니다. Ruby의 `Date` 라이브러리에는 1752년 9월 14일을 나타내는 `Date::ENGLAND` 상수도 포함되어 있습니다. 이 날짜는 이탈리아보다 거의 2세기 늦게 영국 제국이 Gregorian calendar 개혁을 뒤늦게 채택했음을 의미합니다. 새로운 시스템에 맞추기 위해 영국 달력은 11일을 건너뛰었으며, 1752년 9월 2일 다음 날은 1752년 9월 14일이었습니다. 이 극적인 변화는 모든 영국 영토에 걸쳐 11일의 공백을 만들었고, 수십 년 동안 기록과 역사적 해석에 영향을 미쳤습니다.

이러한 특정 역사적 이상 현상은 버그가 아니라 Ruby 표준 라이브러리 내의 의도적인 설계 선택입니다. 개발자들은 정확한 역사적 날짜 계산을 요구하는 애플리케이션을 지원하기 위해 `Date` 클래스를 만들었으며, 이는 '누락된' 날짜를 포함하여 과거 달력 시스템을 작업이 정확하게 반영하도록 보장합니다. 이러한 세심한 주의는 학술 또는 기록 보관 소프트웨어에 중요한 잘못된 역사적 시대 구분을 방지합니다.

일관되고 중단 없는 타임라인이 필요한 시나리오를 위해 Ruby는 필수적인 비상 탈출구를 제공합니다. 개발자는 `Date::GREGORIAN`을 사용하여 `Date` 객체를 명시적으로 초기화할 수 있습니다. 이 상수는 역산 그레고리력을 강제 적용하며, 이는 그레고리력 규칙을 무기한으로 역으로 적용하여 모든 역사적 달력 변경 사항과 관련 공백을 효과적으로 무시합니다. 이는 역사적 중단 없이 원활한 연대순 작업을 보장합니다. 이러한 상수 및 기타 날짜 기능에 대한 자세한 내용은 Class: Date (Ruby 3.1.0) 문서를 참조하십시오.

시간 탐색: 현대 Ruby 모범 사례

Ruby는 시간 데이터를 처리하기 위한 별개의 클래스를 제공합니다: Date, `DateTime`, 및 `Time`. `Date`와 `DateTime`은 Julian-Gregorian transition 및 누락된 날짜를 포함한 역사적 달력 개혁을 세심하게 고려하는 반면, `Time` 클래스는 근본적으로 다른 원칙에 따라 작동합니다. 이러한 구분은 시간 논리를 다루는 개발자에게 중요합니다.

대부분의 현대 애플리케이션에서는 `Time`이 권장되는 선택입니다. 이는 역산 그레고리력을 사용하여 1582년 또는 1752년 개혁 이전의 날짜를 포함한 모든 날짜를 그레고리력이 항상 적용되었던 것처럼 처리합니다. 이 접근 방식은 역사적 달력 변경의 복잡성을 우회하여 일관되고 연속적인 타임라인을 제공합니다. 개발자는 역사적 불연속성을 고려할 필요 없이 단순성과 예측 가능성을 얻습니다.

`Time`과 `Date` 객체 간에 변환할 때, 특히 역사적 날짜의 경우 극도의 주의를 기울이십시오. 이들의 서로 다른 기본 달력 모델은 미묘한 버그와 조용한 데이터 손상으로 이어질 수 있습니다. 1582년 10월 9일을 나타내는 `Date` 객체는 존재하지 않기 때문에 `ArgumentError`를 발생시킬 수 있지만, 동일한 '날짜'의 `Time` 객체를 `Date`로 다시 변환하면 예상치 못하거나 잘못된 `Date` 값이 생성되어 내재된 달력 불일치를 반영할 수 있습니다. 항상 특정 시간 요구 사항에 맞는 적절한 클래스를 선택하십시오.

자주 묻는 질문

Ruby에서 `Date::ITALY` 상수는 무엇입니까?

이는 1582년 10월 15일의 Julian 일련 번호를 나타내는 내장 상수입니다. 이 날짜는 이탈리아 및 기타 가톨릭 국가에서 그레고리력 개혁의 시작을 알립니다.

'1582년 10월 10일'과 같은 날짜를 파싱하면 Ruby에서 런타임 오류가 발생하는 이유는 무엇입니까?

이 날짜는 공식적으로 존재한 적이 없습니다. 달력 오차를 수정하기 위해 Pope Gregory XIII세는 1582년 10월 4일 목요일 다음 날이 1582년 10월 15일 금요일이 될 것이라고 선포했습니다. Ruby의 기본 날짜 엔진은 이를 알고 있으며 해당 간격의 날짜를 유효하지 않은 것으로 간주합니다.

역산 그레고리력은 무엇입니까?

이는 그레고리력의 공식 채택 이전 날짜에 그레고리력 규칙을 적용하는 달력 시스템입니다. 이는 역사적 달력 변경을 무시하고 역사 전반에 걸쳐 일관된 날짜 계산을 제공합니다.

Ruby 애플리케이션에서 이러한 역사적 달력 문제를 어떻게 피할 수 있습니까?

현대 애플리케이션의 경우, 역산 그레고리력을 사용하는 Ruby의 `Time` 클래스를 사용하십시오. 역사적 계산을 위해 `Date` 클래스를 사용해야 하지만 일관된 논리가 필요한 경우, `Date::GREGORIAN`을 사용하여 명시적으로 초기화하여 기본 달력 개혁 인식을 우회하십시오.

One weekly email of tools worth shipping. No drip funnel.

one email per week · unsubscribe in two clicks · no third-party tracking

자주 묻는 질문

Ruby에서 `Date::ITALY` 상수는 무엇입니까?
이는 1582년 10월 15일의 Julian 일련 번호를 나타내는 내장 상수입니다. 이 날짜는 이탈리아 및 기타 가톨릭 국가에서 그레고리력 개혁의 시작을 알립니다.
'1582년 10월 10일'과 같은 날짜를 파싱하면 Ruby에서 런타임 오류가 발생하는 이유는 무엇입니까?
이 날짜는 공식적으로 존재한 적이 없습니다. 달력 오차를 수정하기 위해 Pope Gregory XIII세는 1582년 10월 4일 목요일 다음 날이 1582년 10월 15일 금요일이 될 것이라고 선포했습니다. Ruby의 기본 날짜 엔진은 이를 알고 있으며 해당 간격의 날짜를 유효하지 않은 것으로 간주합니다.
역산 그레고리력은 무엇입니까?
이는 그레고리력의 공식 채택 이전 날짜에 그레고리력 규칙을 적용하는 달력 시스템입니다. 이는 역사적 달력 변경을 무시하고 역사 전반에 걸쳐 일관된 날짜 계산을 제공합니다.
Ruby 애플리케이션에서 이러한 역사적 달력 문제를 어떻게 피할 수 있습니까?
현대 애플리케이션의 경우, 역산 그레고리력을 사용하는 Ruby의 `Time` 클래스를 사용하십시오. 역사적 계산을 위해 `Date` 클래스를 사용해야 하지만 일관된 논리가 필요한 경우, `Date::GREGORIAN`을 사용하여 명시적으로 초기화하여 기본 달력 개혁 인식을 우회하십시오.
🚀더 알아보기

AI 트렌드를 앞서가세요

Stork.AIが엄선한 최고의 AI 도구, 에이전트, MCP 서버를 만나보세요.

P.S. 쓸 만한 걸 만드셨나요? Stork에 등록 — $49

모든 게시물로 돌아가기