GN⁺: JavaScript Temporal이 옵니다
(developer.mozilla.org)-
JavaScript Temporal 릴리즈 시작
- 새로운 JavaScript Temporal 객체의 구현이 브라우저의 실험적 릴리스에 포함되기 시작함. 이는 웹 개발자들에게 큰 소식이며, JavaScript에서 날짜와 시간을 다루는 것이 크게 간소화되고 현대화될 것임.
- 일정 관리, 국제화, 시간 민감 데이터에 의존하는 애플리케이션은 내장 기능을 사용하여 효율적이고 정확하며 일관된 날짜, 시간, 기간, 캘린더를 사용할 수 있음.
- 아직 안정적인 크로스 브라우저 지원까지는 멀었으며, 구현이 발전함에 따라 변경이 있을 수 있지만, 현재의 Temporal을 살펴보고 그 이유와 해결하는 문제를 이해할 수 있음.
- MDN에 이번 주에 추가된 270페이지 이상의 Temporal 문서가 있으며, 자세한 설명과 예제가 포함되어 있음.
-
JavaScript Temporal이란?
- Temporal을 이해하기 위해 JavaScript의
Date
객체를 살펴볼 수 있음. JavaScript가 1995년에 만들어졌을 때,Date
객체는 Java의 초기 결함 있는java.util.Date
구현에서 복사됨. - Java는 1997년에 이 구현을 교체했지만, JavaScript는 거의 30년 동안 동일한 API에 갇혀 있음.
- JavaScript의
Date
객체의 주요 문제는 사용자의 로컬 시간과 UTC만 지원하며, 시간대 지원이 없다는 것임. 또한, 파싱 동작이 매우 신뢰할 수 없고,Date
자체가 변경 가능하여 추적하기 어려운 버그를 유발할 수 있음. - 이러한 모든 문제로 인해 JavaScript에서 날짜와 시간을 다루는 것이 복잡하고 버그가 발생하기 쉬움. 대부분의 개발자는 Moment.js 및 date-fns와 같은 라이브러리에 의존하여 애플리케이션에서 날짜와 시간을 더 잘 처리함.
- Temporal은
Date
객체를 완전히 대체하도록 설계되어 날짜 및 시간 관리를 신뢰할 수 있고 예측 가능하게 만듦. Temporal은 시간대 및 캘린더 표현을 지원하고, 변환, 비교 및 계산, 포맷팅 등을 위한 많은 내장 메서드를 추가함.
- Temporal을 이해하기 위해 JavaScript의
-
핵심 개념
- Temporal에서의 핵심 개념은 인스턴트(역사의 고유한 지점), 벽시계 시간(지역 시간), 기간임. API는 이러한 개념을 처리하기 위해 다음과 같은 구조를 가짐:
-
기간:
Temporal.Duration
두 시간 지점 간의 차이 -
시간 지점:
-
고유한 시간 지점:
- 타임스탬프로서:
Temporal.Instant
- 시간대가 있는 날짜-시간:
Temporal.ZonedDateTime
- 타임스탬프로서:
-
시간대에 무관한 날짜/시간 ("Plain"):
- 전체 날짜 및 시간:
Temporal.PlainDateTime
- 날짜만:
Temporal.PlainDate
- 연도 및 월:
Temporal.PlainYearMonth
- 월 및 일:
Temporal.PlainMonthDay
- 시간만:
Temporal.PlainTime
- 전체 날짜 및 시간:
-
고유한 시간 지점:
-
현재: 다양한 클래스 인스턴스 또는 특정 형식으로 현재 시간을 얻기 위해
Temporal.now
사용
-
기간:
- Temporal에서의 핵심 개념은 인스턴트(역사의 고유한 지점), 벽시계 시간(지역 시간), 기간임. API는 이러한 개념을 처리하기 위해 다음과 같은 구조를 가짐:
-
Temporal 예제
- Temporal의 가장 기본적인 사용법 중 일부는 ISO 문자열로 현재 날짜와 시간을 얻는 것임. 이제 많은 메서드에서 시간대를 제공할 수 있으며, 이는 복잡한 계산을 스스로 수행할 필요가 없게 함.
- 다양한 캘린더와 작업하는 것도 간소화되어, 그레고리력 외의 캘린더 시스템(예: 히브리어, 중국어, 이슬람)에서 날짜를 생성할 수 있음.
- Unix 타임스탬프와 작업하는 것은 많은 시스템(API, 데이터베이스)에서 시간을 나타내기 위해 형식을 사용하기 때문에 매우 일반적인 사용 사례임.
-
compare()
메서드는 기간을 우아하고 효율적으로 정렬할 수 있게 함.
-
Temporal 시도 및 브라우저 지원
- 지원은 실험적 브라우저 릴리스에 천천히 포함되기 시작했으며, Firefox가 현재 가장 성숙한 구현을 가지고 있음.
- Firefox에서는 Temporal이
javascript.options.experimental.temporal
환경 설정 뒤에 있는 Nightly 버전에 내장되고 있음. - 실험적 구현이 도입되면서, Temporal을 시도하고 JavaScript에서 날짜와 시간을 처리하는 현대적인 접근 방식을 익힐 좋은 시기임.
-
감사의 말
- Eric Meyer에게 주제에 대한 작업에 감사함. Eric이 mdn/content의 포크에서 브라우저 호환성 데이터를 문서화하고 문서를 구성한 지 약 4년이 지남.
- Joshua Chen이 Eric으로부터 바통을 이어받아 MDN 문서에 대한 풀 리퀘스트를 준비함.
- André Bargull이 Firefox Temporal 구현에 대한 작업에 감사함.
Hacker News 의견
-
Temporal은 기존 Date() API의 문제를 해결하는 데 유용함. Rust의 chrono와 Java의 Joda Time과 같은 고품질 시간 라이브러리에서 영감을 받아 편리한 API를 제공함
- 시간은 복잡하며, Temporal은 이를 나이브 시간, 인스턴트, 존드 시간으로 구분하여 처리함
- 타임스탬프에 하루를 더하는 작업을 할 때, 특정 시간대에 로컬인지 결정해야 함. 그렇지 않으면 DST나 시간대 변경 시 버그가 발생할 수 있음
- "고정 오프셋" 타임스탬프와 특정 시간대의 타임스탬프 간의 직렬화 문제도 해결함
-
Temporal.ZonedDateTime.prototype.withTimeZone()를 사용하여 시간대를 변환할 수 있음
- 시간대 변환과 지속 시간 처리는 라이브러리가 처리해야 할 중요한 기능이며, Temporal이 이를 처리함
- 그러나 Temporal.Duration은 사용자 정의
format
함수를 제공하지 않음
-
Temporal 제안은 좋지만, 비교 시 참조 동등성을 사용하는 점이 아쉬움
- 이는 객체를 Map 키로 사용하거나 Set에 수집하는 기능을 제거함
-
TC39에서 많은 기능이 개발 중이며, Temporal이 빨리 출시되기를 바람
- 주요 브라우저가 새로운 기능을 지원하려면 개발 노력이 필요함
-
Temporal의 시간대 데이터 업데이트 방식에 대한 궁금증이 있음
- 사용자가 브라우저를 업데이트하지 않으면 잘못된 시간을 볼 수 있음
-
시간대 변경 시 이벤트를 추가해야 한다고 제안함
- 많은 사람들이 매일 시간대를 이동함
-
Temporal이라는 이름이 일반적인 시간 객체와의 충돌을 피하기 위해 사용되었지만, 처음에는 쓰레기 수집 제어로 오해할 수 있음
-
PHP의 Carbon 클래스는 DateTime에서 상속받아 가변 타임스탬프 작업의 문제를 설명함
- CarbonImmutable을 사용하여 항상 새로운 인스턴스를 반환하는 것이 좋음
- Laravel에서 CarbonImmutable과 Carbon을 별칭으로 가져오는 방법을 제안함
-
JavaScript Temporal과 관련된 다양한 기사와 논의가 있음