- JavaScript의 기존 Date 객체의 불완전성과 비일관성을 지적하며, 이를 대체할 Temporal API를 소개
- Date는 가변 객체(mutable object) 로 동작해 실제 날짜 개념과 어긋나며, 파싱 오류·시간대 처리 한계 등 구조적 문제가 있음
- Temporal은 불변성 기반의 새로운 날짜·시간 처리 모델을 제공하며,
PlainDate,ZonedDateTime,Duration등 세분화된 클래스 포함 - Temporal의 메서드는 기존 객체를 수정하지 않고 새로운 객체를 반환, 명확하고 안전한 체이닝 연산 가능
- Temporal은 현재 표준화 단계 3(Stage 3) 에 있으며, Chrome과 Firefox 등 최신 브라우저에서 실험적으로 지원 중
JavaScript의 Date 객체 문제점
-
Date생성자는 불일치한 파싱 규칙과 비직관적 인덱싱으로 혼란을 초래- 예: 월(month)은 0부터 시작하지만, 일(day)과 연도(year)는 1부터 시작
- 문자열
"99"는 1999년으로,"100"은 0100년으로 해석되는 등 일관성 결여
-
Date는 시간(time) 을 중심으로 설계되어 있으며, 내부적으로 Unix 타임스탬프(밀리초 단위) 로 저장 - 시간대(time zone) 지원이 제한적이며, 서머타임(DST) 이나 비그레고리력을 인식하지 못함
- 이러한 한계로 인해 Moment.js, date-fns 등 대형 서드파티 라이브러리 의존이 일반적이며, 이는 성능 저하로 이어짐
불변성과 참조 개념의 충돌
- JavaScript의 원시값(primitive) 은 불변이며 값 자체로 저장되지만, 객체(object) 는 참조(reference)로 저장되어 변경 가능
-
Date는 생성자(constructor) 를 통해 만들어지는 객체이므로 가변적- 예:
setMonth()나setDate()호출 시 원본 객체가 직접 변경됨
- 예:
- 이로 인해 동일한 객체를 참조하는 변수 간에 예상치 못한 값 변경이 발생
- 예:
today를 인자로 전달한 함수가 내부에서 날짜를 수정하면, 원본today도 변경됨
- 예:
Temporal: 새로운 날짜·시간 API
-
Temporal은 생성자가 아닌 네임스페이스 객체(namespace object) 로,Math와 유사한 구조- 주요 구성:
PlainDate,PlainDateTime,PlainTime,ZonedDateTime,Duration,Now등
- 주요 구성:
-
Temporal.Now는 현재 시점의 다양한 형태를 반환-
plainDateISO()→ ISO 형식의 날짜 -
zonedDateTimeISO()→ 시간대 포함 시각
-
- Temporal 객체는 명확한 메서드 체계를 제공
-
add({ days: 1 }),subtract({ years: 2 })등으로 명시적 단위 연산 수행 - 기존 객체를 수정하지 않고 새로운 객체를 반환, 불변성 유지
-
Temporal의 동작 방식과 장점
- Temporal 객체는 여전히 객체형이지만, 의도된 불변적 사용 패턴을 따름
- 예:
today.add({ days: 1 })는 새로운 날짜 객체를 반환하며, 원본today는 변경되지 않음
- 예:
-
Date대비 간결하고 명확한 구문 제공- 예:
const today = Temporal.Now.plainDateISO(); console.log(`Tomorrow will be ${ today.add({ days: 1 }) }. Today is ${ today }.`); // 결과: Tomorrow will be 2026-01-01. Today is 2025-12-31.
- 예:
- 시간대 지정, 기간 계산, ISO 포맷 유지 등 현대적 요구에 부합
-
add,subtract,since,until등 메서드 체이닝으로 복잡한 날짜 계산을 간결하게 표현 가능
표준화 현황과 향후 전망
-
Temporal은 ECMAScript 제안 단계 3(Stage 3) 에 도달, 브라우저 구현이 권장되는 상태 - Chrome과 Firefox에서 이미 실험적 지원이 시작되었으며, 다른 브라우저도 도입 예정
- 개발자들은 현재부터 테스트 및 피드백 제공을 통해 사양 개선에 참여 가능
-
Date는 여전히 존재하겠지만, 향후에는 Temporal이 기본 날짜 처리 방식으로 자리잡을 전망 - 글은 “1995년에 교체했어야 했지만, 지금이라도 Temporal.Now가 최적의 시점”이라며 마무리