터미널이 있다면 cal 9 1752를 한번 입력해 보세요. 1752년 9월 달력이 나오는데, 뭔가 이상해요. 2일 다음이 바로 14일이거든요. 3일부터 13일까지, 11일이 통째로 사라져 있어요. 버그가 아니냐고요? 아니에요. 실제 역사에서 그 날짜들은 존재하지 않았고, 유닉스의 cal 명령어는 그 역사를 그대로 반영하고 있는 거예요. 오늘은 이 '존재하지 않는 날짜들'이 어디서 왔고, 왜 지금도 우리 코드를 괴롭히는지 이야기해 볼게요.
달력에서 11일이 사라진 이유
이야기는 율리우스력에서 시작돼요. 로마 시대부터 쓰이던 율리우스력은 1년을 365.25일로 계산해서 4년마다 윤년을 넣었는데요, 실제 지구가 태양을 도는 데 걸리는 시간은 약 365.2422일이에요. 1년에 11분 정도씩 오차가 나는 건데, 이게 천 년 넘게 쌓이니까 16세기쯤에는 달력이 실제 계절보다 열흘이나 어긋나 버렸어요. 그래서 1582년 교황 그레고리우스 13세가 새 달력(그레고리력)을 도입하면서 10월 4일 다음 날을 바로 10월 15일로 건너뛰게 했어요. 가톨릭 국가들은 바로 따랐지만, 개신교 국가였던 영국은 무려 170년을 버티다가 1752년에야 전환했고, 그 사이 오차가 더 벌어져서 11일을 건너뛰어야 했어요. 그게 바로 cal에서 본 그 달력이에요.
스웨덴은 더 재미있는데요, '한 번에 건너뛰지 말고 40년 동안 윤년을 생략하면서 서서히 맞추자'는 계획을 세웠다가 전쟁 통에 계획을 까먹고 윤년을 넣어버렸어요. 결국 다 꼬여서 율리우스력으로 되돌아가느라 1712년에 2월 30일이라는, 인류 역사상 스웨덴에서만 딱 하루 존재했던 날짜를 만들어냈어요.
개발자에게 왜 문제가 되냐면
'옛날 얘기잖아요'라고 하실 수 있는데, 이게 현대 소프트웨어에 그대로 스며들어 있어요. 대부분의 프로그래밍 언어와 라이브러리는 '선발적 그레고리력(proleptic Gregorian calendar)'을 써요. 이게 뭐냐면, 그레고리력이 실제로는 1582년에 시작됐지만 그 이전 과거까지도 그레고리력이 쭉 있었던 것처럼 거꾸로 연장해서 계산하는 방식이에요. 파이썬의 datetime, 자바스크립트의 Date가 이렇게 동작해요. 반면 자바의 GregorianCalendar는 1582년 10월 15일을 전환점으로 그 이전은 율리우스력으로 계산하고, 유닉스 cal은 영국 기준인 1752년을 써요. 그러니까 같은 '1700년 3월 1일'이라도 어떤 라이브러리를 쓰느냐에 따라 실제로는 서로 다른 날을 가리킬 수 있는 거예요. 역사 기록, 족보, 고문서 아카이브처럼 오래된 날짜를 다루는 서비스라면 실제로 터지는 문제예요.
그리고 존재하지 않는 날짜는 과거에만 있는 게 아니에요. 사모아는 2011년 12월 30일을 통째로 건너뛰었어요. 날짜변경선 서쪽으로 표준시를 옮기면서 그날 하루가 나라 전체에서 사라진 거예요. 서머타임이 있는 나라에선 매년 봄마다 새벽 2시 30분 같은 '존재하지 않는 시각'이 생기고요. 사용자 입력으로 2월 30일이 들어오는 건 검증으로 막는다 쳐도, '매달 31일에 결제' 같은 로직이나 타임존 경계에서 터지는 버그는 정말 흔하거든요.
그래서 어떻게 해야 할까요
교훈은 단순해요. 날짜 계산을 절대 손으로 하지 마세요. '하루는 86400초'라거나 '다음 달 같은 날은 월에 +1' 같은 가정은 전부 어딘가에서 깨져요. 자바라면 java.time, 자바스크립트라면 새로 표준화된 Temporal API, 파이썬이라면 dateutil처럼 검증된 라이브러리를 쓰는 게 기본이고요. 역사적 날짜를 다룰 땐 어떤 달력 체계 기준인지 명시하고, 시간 데이터는 항상 타임존 정보와 함께 저장하는 게 안전해요. 테스트를 짤 때도 윤년, 서머타임 전환일, 월말 같은 경계 날짜를 일부러 넣어보는 습관이 큰 사고를 막아줘요.
정리하면, 달력은 천문학과 정치와 종교가 뒤엉킨 역사적 산물이라 우리가 직관적으로 생각하는 것보다 훨씬 지저분하고, 그 지저분함이 코드 안에까지 들어와 있다는 거예요. 여러분은 날짜/시간 처리 때문에 고생해 본 경험 있으신가요? 윤년, 타임존, 서머타임... 각자의 전쟁담이 궁금하네요.
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공