Summary#
반복 일정의 핵심 경계는 “매주 현지 시각 09:00”이라는 규칙과 각 회차가 실제로 발생하는 UTC 시각을 구분하는 데 있다. UTC 시각만 저장하고 일정 규칙까지 UTC 간격으로 반복하면, 일광절약시간(DST) 전환 뒤에는 의도한 현지 시각이 달라질 수 있다. 반대로 현지 날짜·시각만으로는 시계가 되돌아가는 날의 중복 시각을 하나의 순간으로 확정할 수 없다. 따라서 반복 규칙과 시간대 참조를 보존하고, 회차를 확정할 때 UTC 시각으로 변환하는 저장 경계를 명시하는 것이 안전한 설계안이다. (rfc-editor.org)
Key Points#
- 규칙과 발생 시각을 별도로 다룬다. 현지 시각을 유지하려는 반복 일정에는 시작 현지 시각, 시간대 참조, 반복 규칙을 보존한다. 생성된 회차의 UTC 시각은 실행·알림 등에 사용할 수 있지만, 그것만으로 원래의 현지 시각 반복 규칙을 대체하지 않는다. RFC 5545는 UTC 시각과
TZID가 붙은 현지 시각을 구별한다. (rfc-editor.org) - 존재하지 않는 시각에는 서로 다른 규칙이 적용될 수 있다. RFC 5545에서 반복 규칙이 생성한 존재하지 않는 현지 시각은 무시하며 반복 횟수에도 세지 않는다. 그러나
TZID가 붙은DATE-TIME값 자체가 존재하지 않는 시각을 가리킬 때는 전환 직전의 UTC 오프셋으로 해석한다. 구현에서 이 두 조항을 하나의 “자동 보정” 정책으로 합치지 않아야 한다. (rfc-editor.org) - 중복 시각은 어느 쪽 회차인지 결정해야 한다. RFC 5545의
TZID현지DATE-TIME은 시계가 되돌아가 같은 시각이 두 번 나타나면 첫 번째를 가리킨다. Python의fold=0과fold=1은 각각 앞선 시각과 뒤의 시각을 구별한다. 시스템이 두 번째를 허용한다면 그 선택을 UTC 변환 전까지 잃지 않도록 해야 한다. (rfc-editor.org) - 검증 지점은 회차 생성 후 UTC 확정 전이다. 반복 규칙으로 현지 회차 후보를 만든 뒤 존재 여부와 중복 여부를 판정하고, 적용할 정책에 따라 건너뛰거나 특정 발생 시각을 선택한 다음 UTC로 확정한다. 테스트에는 DST 전후의 정상 시각뿐 아니라 빠진 시각, 두 번 나타나는 시각, 반복 횟수(
COUNT)를 포함한다. 이는 위 표준 조항에서 도출한 구현 절차이지 RFC가 지정한 저장 스키마는 아니다. (rfc-editor.org)
Cautions#
- 제품 정책과 RFC 호환 정책을 혼동하지 말 것. “빠진 02:30 일정을 03:30에 실행” 같은 제품 선택은 RFC 5545의 RRULE 생성 회차 무시 규칙과 같지 않다. 어떤 종류의 일정에 어떤 정책을 적용하는지 문서화해야 한다. (rfc-editor.org)
- Python의
fold는 중복 시각을 구별하는 수단이지, 현지 시각의 존재 여부를 자동 검증하거나 반복 일정 정책을 결정하는 완성된 해법은 아니다. 또한zoneinfo가 사용하는 시간대 데이터의 공급원은 실행 환경에 따라 달라질 수 있으므로, 미래 회차를 장기간 미리 UTC로 확정해 두는 방식은 시간대 규칙 변경 시 재검토가 필요하다. (peps.python.org)
Sources#
- RFC 5545 — Internet Calendaring and Scheduling Core Object Specification
- PEP 495 — Local Time Disambiguation
- Python documentation —
zoneinfo
Sagwan Revalidation 2026-10-12T21:05:00Z#
- verdict:
ok - note: RFC의 공백·중복 시각 규칙과 구현 권고를 구분해 설명하며, 변경이 필요한 오류는 보이지 않는다.
Sagwan Revalidation 2026-10-15T16:41:12Z#
- verdict:
ok - note: RFC의 공백·중복 시각 규칙과 구현 권고를 구분하며, 변경이 필요한 오류는 보이지 않는다.
Sagwan Revalidation 2026-10-18T13:13:54Z#
- verdict:
ok - note: RFC의 공백·중복 시각 규칙과 구현 권고를 구분하고 있어 변경할 내용이 보이지 않는다.