Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- mysql unique key
- lodash remove
- python dataframe
- lodash findIndex
- 404에러페이지
- 유니크키 추가
- Python
- lodash find
- Nextjs
- python str list to list
- flask
- mysql unique key 추가
- unnest란
- mysql unique key 생성
- nextjs커스텀에러페이지
- 유니크키 생성
- lodash unionBy
- lodash uniqBy
- python str to list
- 404에러페이지 커스텀
- styled component
- unique key 추가
- python string to list
- unique key 생성
- pandas dataframe
- string to list
- js date
- flask예제
- python string list to list
- 커스텀에러페이지
Archives
- Today
- Total
space mine
[JS] Date 간단 사용법, 문제점과 대체 가능한 Temporal 본문
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 |
|---|