space mine

[JS] Date 간단 사용법, 문제점과 대체 가능한 Temporal 본문

JavaScript

[JS] Date 간단 사용법, 문제점과 대체 가능한 Temporal

mi-ne 2026. 1. 16. 13:48

JavaScript의 Date 객체는 JS 초창기부터 존재해 왔으며, 지금도 광범위하게 사용됩니다.

그러나 실무에서 Date를 사용하여 날짜와 시간을 다루다 보면 마주치는 문제들이 몇가지 있습니다.

Date가 가진 문제점과 이를 해결 가능한 대체제인 Temporal에 대해 알아보겠습니다.

 


JavaScript Date의 기본 사용법

 

객체 생성

const now = new Date();
const fromTimestamp = new Date(1700000000000);
const fromParts = new Date(2026, 0, 1); // 2026-01-01

 

  • 월(month)은 0부터 시작
  • 내부 값은 항상 UTC 기준의 millisecond timestamp
  • 출력과 연산은 기본적으로 로컬 타임존을 사용

 

값 조회

now.getFullYear(); // 연도
now.getMonth();    // 0 ~ 11
now.getDate();     // 1 ~ 31
now.getHours();    // 로컬 시간 기준

//UTC 기준 메서드
now.getUTCFullYear();
now.getUTCHours();

 

  • API가 이원화되어 있으며, 기본 메서드가 어떤 기준을 사용하는지는 코드만 보고 판단하기 어려움

 

값 변경

const d = new Date(2026, 0, 1);
d.setDate(d.getDate() + 1);
  • Date는 불변 객체가 아님
  • set* 계열 메서드는 원본 객체를 직접 변경 -> 가장 치명적인 단점이라고 생각됨

 


Temporal: Date를 대체하기 위한 표준 API

 

Temporal은 ECMAScript 표준 위원회인 TC39에서 설계한 차세대 날짜·시간 API입니다.
우리가 많이 사용하고 있는 Date의 문제를 전제로 설계되었습니다.

아래에서 Date의 문제와 이를 보완한 Temporal을 비교하여 살펴봄시다.

 

객체의 변경

Date: 가변 객체

function addOneDay(date) {
  date.setDate(date.getDate() + 1);
  return date;
}

const today = new Date(2026, 0, 1);
const tomorrow = addOneDay(today);

console.log(today);     // 2026-01-02
console.log(tomorrow);  // 2026-01-02

 

  • 코드 실행 이후 today와 tomorrow는 같은 날짜를 가짐
  • tomorrow 값을 계산하며 today까지 영향을 미치는 상황

 

Temporal: 불변 객체

const d1 = Temporal.PlainDate.from("2026-01-01");
const d2 = d1.add({ days: 1 });

 

  • d1은 변경되지 않음, d2는 새로운 객체

 

문자열 파싱

Date: 환경에 따라 다른 결과

new Date("2026-01-01");

이 코드는 다음 중 하나로 해석될 수 있음

  • 2024-01-01T00:00:00 (로컬 타임존)
  • 2023-12-31T15:00:00Z (UTC 변환)

타임존이 명시되지 않았기 때문에 런타임 환경이 해석을 결정
같은 코드가 다른 서버에서 다른 결과를 만들게됨

 

Temporal: 다른 환경에서도 같은 결과

Temporal.PlainDate.from("2026-01-01");

 

  • 타임존 변환 없음
  • 환경 차이 없음
  • 항상 동일한 결과

 

시간 분리

Temporal.Instant        // UTC 타임스탬프
Temporal.PlainDate      // 날짜만 (타임존 없음)
Temporal.PlainTime      // 시각만
Temporal.ZonedDateTime  // 날짜 + 시간 + 타임존
  • 객체 하나로 처리하지 않고 필요한 정보만 포함한 타입 제공
  • 타임존이 필요한 상황에서 누락되면 코드 실패

 


결론

 

Date는 아래 상황에서만 안전하게 사용 가능합니다.

  • 타임스탬프 저장
  • 로그 기록
  • 네트워크 전송용 시간 값
  • 다른 시스템과의 인터페이스

즉, Date는 “시간 값”이지 “날짜 규칙 엔진”이 아닙니다.

업무 로직에서 Date를 직접 연산 대상으로 사용하는 것은 치명적인 에러를 발생시킬 수 있습니다.

 

Temporal을 사용해야하는 상황은 아래와 같습니다.

  • 계약 기간 계산
  • 정산, 청구, 회계 로직
  • 캘린더 기반 기능
  • 사용자가 인식하는 날짜 처리

 

 

참고 아티클: https://piccalil.li/blog/date-is-out-and-temporal-is-in/

 

'JavaScript' 카테고리의 다른 글

[JS] lodash란? 유용한 메소드와 사용법까지  (2) 2023.06.08