구글 캘린더 API에서 종료일이 +1 만큼 더 긴데?
구글 캘린더 API를 사용하여, 일정 데이터를 조회할 때 의문점을 하나 발견하였습니다.


2025/08/18 ~ 2025/08/19로 저장한 일정이,
API를 통해 조회해보니 2025/08/18 ~ 2025/08/20으로 조회되고 있었습니다.


버그인가 싶어, 다른 일정 정보들도 확인해보았으나,
해당 일정 뿐 아니라, 모든 일정이 +1 만큼 되어 있었습니다.
당일치기 일정 역시 +1 만큼 되어 2일로 조회가 되네요. 😮
종료일은 포함되지 않는다: 배타적 종료(Exclusive End) 법칙
위 응답은 사실 정상적인 데이터입니다.
이는, 배타적 종료(Exclusive End) 법칙 때문인데요.
이벤트의 종료일은 포함하지 않고, 그 직전 일정까지 포함한다는 원칙입니다.
즉, 2025/08/18 ~ 2025/08/20으로 표기하였지만,
2025/08/18 ~ 2025/08/19 23:59:5999... 까지 시간을 의미하는 것이죠.

이와 같이 종료 시점은 포함하지 않는다는 것을
반열린 구간 (Half-Open Interval)이라 하며, [Start, End) 와 같이 표기합니다.
왜 이와 같이 처리하나?
시간표를 생각하면 쉽습니다.
이 배타적 종료 법칙은 날짜 뿐 아니라 시간에도 동일하게 적용되는데요.
14~15시 수업이 있을 경우, 이는 실제로는 14:00:00 ~ 14:59:59를 의미합니다.
시간표를 짤 때 보통은 강의 시간이 중복되어서는 안되겠죠.
그렇다면, 배타적 종료 법칙이 없다면 어떻게 될까요?
14~15시 수업 1과, 15~16시 수업 2를 등록하려 하면,
수업 1의 종료 시간인 15:00와, 수업 2의 시작 시간인 15:00이 겹쳐 둘 중 하나가 등록되지 않는 현상이 발생되게 됩니다!


따라서, 배타적 종료 원칙이 없다면,
[수업1] 13:00:00 ~ 13:59:59,
[수업2] 14:00:00 ~ 14:59:59와 같이 데이터를 넣어줘야 하는 것이죠.
배타적 종료 법칙이 없다면, 개발자가 프로그램을 개발할 때 직접 +- 1초, 분 등을 해줘야 하는 것이죠.
이해하기 편하도록 시간 + 강의표을 예시로 들었지만, 날짜의 경우에도 동일하게 적용되는 부분입니다.
마치며
이는 사실, 다른 캘린더에서도 동일하게 적용되는 규칙으로,
국제 표준인 RFC 5545 (iCalendar, https://en.wikipedia.org/wiki/ICalendar)
ISO 8601 (https://en.wikipedia.org/wiki/ISO_8601)에 의거한 설계입니다.
프로그래밍 및 수학적 관점에서 계산 및 겹침 처리가 쉽기 때문입니다.
'기타' 카테고리의 다른 글
| [Intellij 에러] error: unmappable character (0xE3) for encoding x-windows-949 에러 (0) | 2023.09.05 |
|---|---|
| 유클리드 거리와 맨해튼 거리 (0) | 2023.08.21 |
| 파이썬과 코틀린의 for문이 C, 자바의 for문과 다르게 생긴 이유 (feat. 부수효과(side-effect)) (0) | 2023.08.08 |
| x가 0이 아니면서 x와 -x가 같은 경우가 있을까? (백준 15549번) (0) | 2023.08.08 |
| 라이브러리와 프레임워크의 공통점과 차이점 (0) | 2023.08.04 |
