Uknow's Lab.
article thumbnail

구글 캘린더 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)에 의거한 설계입니다.

프로그래밍 및 수학적 관점에서 계산 및 겹침 처리가 쉽기 때문입니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.