2026.02.02 · 6분 읽기
Date는 날짜가 아니다: 타임존 실수를 막는 기준 정리
Date 타입을 날짜로 착각했을 때 발생하는 오류를 UTC/KST/ISO 8601 기준과 실수 사례로 정리합니다.
Date 타입은 왜 날짜가 아니라고 하나요?
Date는 특정 날짜가 아니라 UTC 기준의 "순간(instant)"을 의미한다. 같은 Date라도 해석하는 타임존에 따라 날짜가 달라질 수 있다.
Date 타입 예시
const date: Date = new Date();
------------------------------
const a: Date = new Date(); // 현재 시각
const b: Date = new Date('2026-01-01'); // UTC 자정
const c: Date = new Date('2026-01-01T00:00+09'); // KST 자정
// a, b, c 모두 Date 타입TypeScript에서는 세 값 모두 동일하게 Date 타입으로 취급된다. 문제는 서로 다른 의미의 값이 같은 타입으로 표현된다는 점이다.
Date 타입 하나로 해결되지 않는 문제는 무엇인가요?
Date 타입 하나로는 아래 구분을 안전하게 표현할 수 없다.
- 날짜만인지, 시간만인지, 둘 다인지
- UTC 기준인지, KST 기준인지
- 서버 기준인지, 사용자 기준인지
기준(UTC/KST/ISO 8601)을 어떻게 정해야 하나요?
UTC: 전 세계 기준 시간. 서머타임이 없고 어디에도 속하지 않는 기준.
KST: 한국 표준시. UTC +9시간이며 서머타임 없음.
ISO 8601: 날짜/시간을 문자열로 표현하는 국제 표준 포맷.
2026-01-01T00:00:00Z
2026-01-01T00:00:00+09:00 // KST
2026-01-01T00:00:00-08:00 // PSTnew Date()는 어디 기준인가요?
new Date()는 현재 시점의 UTC 타임스탬프를 생성한다. 다만 문자열로 변환하면 로컬 타임존으로 표시된다.
const d = new Date();
d.toString(); // 로컬(KST)로 표시
d.toISOString(); // UTC로 표시toString()은 표현만 바꾸고 내부 UTC 타임스탬프는 그대로 유지한다.
문자열로 Date를 만들면 안전한가요?
문법적으로는 안전해 보이지만, 의도하지 않은 시간 값이 생성될 수 있다. 특히 "날짜만" 원했는데 UTC 기준으로 해석되면 하루가 밀리는 문제가 발생한다.
// 원했던 값: 2026-01-01 00:00 (KST)
const date = new Date('2026-01-01');
const key = date.toISOString().split('T')[0];KST 자정을 UTC로 변환하면 전날로 바뀌고, 다시 KST로 해석하면 하루가 밀린 것처럼 보인다.
실수 사례: 왜 하루가 밀렸나요?
호스트는 KST 기준으로 예약을 만들고, 게스트는 로컬 타임존으로 해석한다는 가정이 깨졌다. 저장은 UTC로, 표시는 KST로 변환해야 하는데 이를 생략하면서 하루가 밀렸다.
| 단계 | 결과 |
|---|---|
| 저장 | Date.now()로 UTC 기준 타임스탬프 저장 |
| 표시 | KST로 표시하면서 하루가 밀림 |
| 결과 | 의도한 날짜보다 하루 뒤로 보임 |
결론
- Date는 날짜가 아니라 "순간"이다.
- API 저장은 UTC, 표시 단계는 사용자 타임존 변환이 기본이다.
- 날짜만 필요하면 문자열로 분리해서 관리한다.
- Timezone 값을 명시해 변환 기준을 통일한다.
서머타임은 어떻게 처리해야 하나요?
DST는 하루가 24시간이라는 기준을 깨뜨린다. 직접 계산하기보다 UTC로 저장한 뒤 타임존 정보를 통해 표시 단계에서 변환하는 방식이 가장 안전하다.
세 줄 요약
- Date는 날짜가 아니다.
- Date는 UTC 기준의 "순간"이다.
- 날짜는 그 순간을 어떻게 해석하느냐의 문제다.
자주 묻는 질문 (FAQ)
Date.now()를 써도 안전한가요?
안전하다. 다만 타임존 변환 기준을 정하지 않으면 표시 단계에서 문제를 만들 수 있다.
날짜만 저장할 때는 어떤 타입이 좋나요?
날짜만 필요하다면 문자열(예: 2026-01-01)로 별도 관리하는 것이 안전하다.
API는 왜 UTC로 저장하나요?
서버 간 기준을 통일하고 DST 영향을 줄이기 위해 UTC를 기본으로 유지하는 것이 일반적이다.
관련 글
같은 주제를 다룬 글을 추가로 준비 중이다.
- 타임존 기준을 설계하는 체크리스트 (준비 중)
- 캘린더 서비스에서 발생하는 날짜 버그 모음 (준비 중)
PPA (People Also Ask)
사람들이 실제로 자주 묻는 질문을 짧게 정리했다.
- "UTC로 저장하면 로컬에서는 어떻게 보여지나요?"
- "타임존 변환은 클라이언트에서만 해도 되나요?"
- "Date 대신 사용할 만한 라이브러리가 있나요?"