<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TC39 Archives -</title>
	<atom:link href="https://blog.kwt.co.kr/tag/tc39/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kwt.co.kr/tag/tc39/</link>
	<description>여러분의 돈과 시간을 낭비하지마세요.</description>
	<lastBuildDate>Sat, 21 Mar 2026 11:15:34 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>

<image>
	<url>https://blog.kwt.co.kr/wp-content/uploads/2022/07/cropped-logo_bg-32x32.jpg</url>
	<title>TC39 Archives -</title>
	<link>https://blog.kwt.co.kr/tag/tc39/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>JavaScript Temporal API &#8211; 9년 만에 Date를 대체하는 새 표준</title>
		<link>https://blog.kwt.co.kr/javascript-temporal-api-9%eb%85%84-%eb%a7%8c%ec%97%90-date%eb%a5%bc-%eb%8c%80%ec%b2%b4%ed%95%98%eb%8a%94-%ec%83%88-%ed%91%9c%ec%a4%80/</link>
					<comments>https://blog.kwt.co.kr/javascript-temporal-api-9%eb%85%84-%eb%a7%8c%ec%97%90-date%eb%a5%bc-%eb%8c%80%ec%b2%b4%ed%95%98%eb%8a%94-%ec%83%88-%ed%91%9c%ec%a4%80/#respond</comments>
		
		<dc:creator><![CDATA[시간 조절자]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 01:19:53 +0000</pubDate>
				<category><![CDATA[기술]]></category>
		<category><![CDATA[CES2026]]></category>
		<category><![CDATA[Date]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TC39]]></category>
		<category><![CDATA[TypeScript]]></category>
		<guid isPermaLink="false">https://blog.kwt.co.kr/?p=1928</guid>

					<description><![CDATA[<p>3줄 요약 1. Temporal API가 TC39 Stage 4에 도달하며 ES2026 표준에 정식 포함된다. ECMAScript 역사상 가장 큰 단일 추가(약 4,500개 테스트)다.2. 30년간 개발자를 괴롭혀 온 Date 객체의 가변성, 0-based 월, 타임존 미지원 문제를 근본적으로 해결한다.3. Chrome 144, Firefox 139, Edge 144에서 이미 사용 가능하며, Temporal.PlainDate, Temporal.ZonedDateTime 등 용도별 8개 타입을 제공한다. 결론부터 말하면 JavaScript의 Date [&#8230;]</p>
<p>The post <a href="https://blog.kwt.co.kr/javascript-temporal-api-9%eb%85%84-%eb%a7%8c%ec%97%90-date%eb%a5%bc-%eb%8c%80%ec%b2%b4%ed%95%98%eb%8a%94-%ec%83%88-%ed%91%9c%ec%a4%80/">JavaScript Temporal API &#8211; 9년 만에 Date를 대체하는 새 표준</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">3줄 요약</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>1. Temporal API가 TC39 Stage 4에 도달하며 ES2026 표준에 정식 포함된다. ECMAScript 역사상 가장 큰 단일 추가(약 4,500개 테스트)다.<br>2. 30년간 개발자를 괴롭혀 온 Date 객체의 가변성, 0-based 월, 타임존 미지원 문제를 근본적으로 해결한다.<br>3. Chrome 144, Firefox 139, Edge 144에서 이미 사용 가능하며, <code>Temporal.PlainDate</code>, <code>Temporal.ZonedDateTime</code> 등 용도별 8개 타입을 제공한다.</p>
</blockquote>



<h2 class="wp-block-heading">결론부터 말하면</h2>



<p>JavaScript의 <code>Date</code> 객체는 1995년 Java에서 급하게 포팅된 이후 30년간 변하지 않았다. Temporal API는 불변 객체, IANA 타임존 네이티브 지원, 나노초 정밀도, 용도별 분리된 타입을 제공하며 이 문제를 완전히 해결한다. 2026년 3월 Stage 4에 도달했고, 주요 브라우저에서 이미 지원 중이다.</p>



<h2 class="wp-block-heading">Temporal API란?</h2>



<p>Temporal은 JavaScript의 <code>Date</code> 객체를 대체하기 위해 설계된 새로운 날짜/시간 API다. TC39(ECMAScript 표준 위원회)에서 2017년 Stage 1으로 시작해 9년간 개발되었으며, 2026년 3월 Stage 4에 도달하면서 ES2026 표준에 포함이 확정됐다.</p>



<p><code>Date</code> 객체 하나로 모든 날짜/시간 개념을 처리하던 기존 방식 대신, Temporal은 상황에 맞는 8개의 독립된 타입을 제공한다. 모든 객체는 불변(immutable)이며, 시간대 처리가 내장되어 있다.</p>



<p>Bloomberg, Google, Mozilla, Microsoft, Igalia 등이 공동으로 개발에 참여했으며, <a href="https://github.com/nicolo-ribaudo/tc39-proposal-stats">Test262</a> 기준 약 4,500개의 테스트가 추가되어 ECMAScript 역사상 가장 큰 규모의 기능 추가다.</p>



<h2 class="wp-block-heading">기존 Date 객체의 문제점</h2>



<p><code>Date</code>가 왜 교체 대상이 되었는지 구체적으로 살펴보자.</p>



<h3 class="wp-block-heading">가변성(Mutability)</h3>



<pre class="wp-block-code"><code>const meeting = new Date(2026, 2, 15, 14, 0); // 3월 15일

scheduleMeeting(meeting);

// meeting 객체가 함수 내부에서 변경되었을 수 있다
console.log(meeting); // 예측 불가</code></pre>



<p><code>Date</code> 객체는 <code>setMonth()</code>, <code>setDate()</code> 등으로 원본이 직접 변경된다. 여러 곳에서 같은 객체를 참조하면 의도치 않은 버그가 발생한다.</p>



<h3 class="wp-block-heading">0-based 월 인덱싱</h3>



<pre class="wp-block-code"><code>new Date(2026, 0, 1);  // 1월 1일 (0 = 1월)
new Date(2026, 11, 1); // 12월 1일 (11 = 12월)</code></pre>



<p>1월이 0이고 12월이 11이다. 이 설계는 off-by-one 에러의 대표적 원인이다.</p>



<h3 class="wp-block-heading">브라우저별 파싱 차이</h3>



<pre class="wp-block-code"><code>new Date("2026-01-01"); // 어떤 브라우저는 UTC로, 다른 브라우저는 로컬 시간으로 해석</code></pre>



<p>같은 문자열이 환경에 따라 다른 결과를 반환한다. 날짜 문자열 파싱 규칙이 명확하지 않기 때문이다.</p>



<h3 class="wp-block-heading">타임존 지원 부재</h3>



<pre class="wp-block-code"><code>const date = new Date();
date.getTimezoneOffset(); // 오프셋만 반환, IANA 타임존 이름은 없음</code></pre>



<p><code>Date</code>는 타임존이 아닌 오프셋만 지원한다. &#8220;Asia/Seoul&#8221;이나 &#8220;America/New_York&#8221; 같은 IANA 타임존을 다룰 방법이 없다. DST(서머타임) 전환도 제대로 처리하지 못한다.</p>



<h3 class="wp-block-heading">날짜 전용 타입 없음</h3>



<p>생일처럼 시간 정보가 불필요한 경우에도 <code>Date</code>는 항상 시간과 타임존 정보를 포함한다. &#8220;3월 15일&#8221;이라는 단순한 날짜를 표현할 깔끔한 방법이 없다.</p>



<h2 class="wp-block-heading">Temporal의 8가지 타입</h2>



<p>Temporal은 용도에 따라 정확한 타입을 선택해서 사용한다.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>타입</th><th>설명</th><th>사용 예시</th></tr></thead><tbody><tr><td><code>PlainDate</code></td><td>날짜만 (시간 없음)</td><td>생일, 공휴일</td></tr><tr><td><code>PlainTime</code></td><td>시간만 (날짜 없음)</td><td>알람, 영업시간</td></tr><tr><td><code>PlainDateTime</code></td><td>날짜 + 시간 (타임존 없음)</td><td>로컬 이벤트</td></tr><tr><td><code>ZonedDateTime</code></td><td>날짜 + 시간 + 타임존</td><td>글로벌 서비스, 항공편</td></tr><tr><td><code>Instant</code></td><td>UTC 절대 시점</td><td>서버 로그, 타임스탬프</td></tr><tr><td><code>Duration</code></td><td>시간 간격</td><td>경과 시간, 타이머</td></tr><tr><td><code>PlainYearMonth</code></td><td>연월</td><td>월별 청구, 리포트</td></tr><tr><td><code>PlainMonthDay</code></td><td>월일</td><td>기념일, 매년 반복 이벤트</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">핵심 코드 예시</h2>



<h3 class="wp-block-heading">PlainDate — 시간대 없는 날짜</h3>



<pre class="wp-block-code"><code>// 생성
const birthday = Temporal.PlainDate.from("2026-03-15");
const today = Temporal.Now.plainDateISO();

// 불변 연산 — 원본은 변하지 않는다
const nextWeek = today.add({ days: 7 });
console.log(today.toString()); // 원본 그대로
console.log(nextWeek.toString()); // 7일 후

// 두 날짜 사이의 간격
const diff = today.until(birthday);
console.log(diff.days); // 남은 일수</code></pre>



<h3 class="wp-block-heading">ZonedDateTime — 타임존 포함 날짜/시간</h3>



<pre class="wp-block-code"><code>// 서울과 뉴욕의 같은 '순간'
const seoul = Temporal.ZonedDateTime.from(
  "2026-03-15T09:00:00+09:00&#91;Asia/Seoul]"
);

const newYork = seoul.withTimeZone("America/New_York");

console.log(seoul.toString()); // "2026-03-15T09:00:00+09:00&#91;Asia/Seoul]"
console.log(newYork.toString()); // "2026-03-14T19:00:00-05:00&#91;America/New_York]"

// DST 자동 처리
const london = Temporal.ZonedDateTime.from(
  "2026-03-29T00:30:00+00:00&#91;Europe/London]"
);

const plus1h = london.add({ hours: 1 }); // "2026-03-29T02:30:00+01:00&#91;Europe/London]"
// 01:30은 DST 전환으로 존재하지 않으므로 자동 건너뜀</code></pre>



<h3 class="wp-block-heading">Instant — 절대 시점</h3>



<pre class="wp-block-code"><code>// 서버 이벤트 기록
const eventTime = Temporal.Now.instant();
console.log(eventTime.epochMilliseconds); // Unix 타임스탬프 (ms)

// 특정 시점을 각 시간대로 변환
const instant = Temporal.Instant.from("2026-03-15T00:00:00Z");
const inSeoul = instant.toZonedDateTimeISO("Asia/Seoul");
const inTokyo = instant.toZonedDateTimeISO("Asia/Tokyo");
console.log(inSeoul.hour); // 9 (UTC+9)
console.log(inTokyo.hour); // 9 (UTC+9)</code></pre>



<h3 class="wp-block-heading">Duration — 시간 간격 계산</h3>



<pre class="wp-block-code"><code>const projectStart = Temporal.PlainDate.from("2026-01-10");
const deadline = Temporal.PlainDate.from("2026-03-31");
const remaining = projectStart.until(deadline);

console.log(remaining.toString()); // "P80D" (80일)

// Duration을 다른 단위로 변환
const duration = Temporal.Duration.from({ hours: 130, minutes: 20 });

console.log(duration.total({ unit: "second" })); // 469200</code></pre>



<h2 class="wp-block-heading">Date vs Temporal 비교</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>항목</th><th><code>Date</code></th><th><code>Temporal</code></th></tr></thead><tbody><tr><td>불변성</td><td>가변 (원본 변경됨)</td><td>불변 (새 객체 반환)</td></tr><tr><td>월 인덱스</td><td>0부터 시작 (0 = 1월)</td><td>1부터 시작 (1 = 1월)</td></tr><tr><td>타임존</td><td>오프셋만 지원</td><td>IANA 타임존 네이티브 지원</td></tr><tr><td>정밀도</td><td>밀리초</td><td>나노초</td></tr><tr><td>타입</td><td>단일 타입</td><td>용도별 8개 타입</td></tr><tr><td>DST 처리</td><td>수동</td><td>자동</td></tr><tr><td>달력</td><td>그레고리력만</td><td>히브리력, 이슬람력 등 지원</td></tr><tr><td>파싱</td><td>브라우저마다 다름</td><td>엄격하고 일관된 규칙</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">브라우저 지원 현황 (2026년 3월 기준)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>브라우저</th><th>버전</th><th>지원 상태</th></tr></thead><tbody><tr><td>Firefox</td><td>139+</td><td>지원 (2025년 5월~)</td></tr><tr><td>Chrome</td><td>144+</td><td>지원 (2026년 1월~)</td></tr><tr><td>Edge</td><td>144+</td><td>지원 (2026년 1월~)</td></tr><tr><td>Safari</td><td>Technology Preview</td><td>부분 지원 (플래그 필요)</td></tr><tr><td>Node.js</td><td>v26</td><td>예정</td></tr><tr><td>TypeScript</td><td>6.0 Beta</td><td>타입 정의 지원 (2026년 2월~)</td></tr></tbody></table></figure>



<p>Safari를 제외한 주요 브라우저에서 이미 사용 가능하다. Safari도 Technology Preview에서 테스트할 수 있으며, 정식 지원은 2026년 내 예상된다.</p>



<p>프로덕션 환경에서 모든 브라우저를 지원해야 한다면 <a href="https://www.npmjs.com/package/@js-temporal/polyfill"><code>@js-temporal/polyfill</code></a> 또는 <a href="https://www.npmjs.com/package/temporal-polyfill"><code>temporal-polyfill</code></a>을 사용할 수 있다.</p>



<pre class="wp-block-code"><code>npm install @js-temporal/polyfill</code></pre>



<pre class="wp-block-code"><code>import { Temporal } from "@js-temporal/polyfill";

const now = Temporal.Now.plainDateISO();

console.log(now.toString()); // 폴리필로 모든 환경에서 동일하게 동작</code></pre>



<h2 class="wp-block-heading">기존 코드 마이그레이션 가이드</h2>



<p>Date에서 Temporal로 전환할 때 자주 쓰는 패턴을 정리했다.</p>



<pre class="wp-block-code"><code>// (Before) Date — 현재 날짜
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1; // 0-based 보정 필요

// (After) Temporal — 현재 날짜
const today = Temporal.Now.plainDateISO();
const year = today.year;
const month = today.month; // 1-based, 보정 불필요</code></pre>



<pre class="wp-block-code"><code>// (Before) Date — 날짜 비교
const d1 = new Date("2026-03-15");
const d2 = new Date("2026-04-01");
const diffMs = d2 - d1;
const diffDays = Math.floor(diffMs / (1000 <em> 60 </em> 60 * 24)); // 직접 계산

// (After) Temporal — 날짜 비교
const d1 = Temporal.PlainDate.from("2026-03-15");
const d2 = Temporal.PlainDate.from("2026-04-01");
const diff = d1.until(d2);

console.log(diff.days); // 17 — 내장 메서드로 바로 계산</code></pre>



<pre class="wp-block-code"><code>// (Before) Date — 타임존 변환
// 외부 라이브러리(moment-timezone, date-fns-tz) 필수

// (After) Temporal — 타임존 변환
// 외부 라이브러리 없이 네이티브로 처리
const seoul = Temporal.Now.zonedDateTimeISO("Asia/Seoul");
const london = seoul.withTimeZone("Europe/London");</code></pre>



<h2 class="wp-block-heading">Moment.js, date-fns는 이제 필요 없나?</h2>



<p>State of JS 조사에서 날짜 처리는 &#8220;정적 타입 부족&#8221; 다음으로 두 번째 고통 포인트로 꼽혔다. 이 문제를 해결하기 위해 <a href="https://momentjs.com/">Moment.js</a>(2011), <a href="https://date-fns.org/">date-fns</a>, <a href="https://moment.github.io/luxon/">Luxon</a> 같은 라이브러리가 등장했고, 현재 npm에서 주당 8천만 다운로드를 기록하고 있다.</p>



<p>Temporal이 표준화되면서 이 라이브러리들의 핵심 기능(타임존 처리, 불변 연산, 포매팅)이 네이티브로 대체된다. 다만 Moment.js의 상대 시간 표현(<code>3일 전</code>)이나 date-fns의 풍부한 유틸리티 함수처럼 Temporal이 직접 제공하지 않는 편의 기능도 있다.</p>



<p>당장 기존 프로젝트의 라이브러리를 걷어낼 필요는 없지만, 새 프로젝트에서는 Temporal 네이티브로 시작하는 것이 번들 크기와 유지보수 측면에서 유리하다.</p>



<h2 class="wp-block-heading">9년의 여정 — 주요 마일스톤</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>시기</th><th>사건</th></tr></thead><tbody><tr><td>1995년</td><td>Brendan Eich가 Java의 <code>java.util.Date</code>를 JavaScript로 포팅</td></tr><tr><td>2011년</td><td>Moment.js 등장, Date의 한계를 라이브러리로 우회하기 시작</td></tr><tr><td>2017년</td><td>Maggie Johnson-Pint(Moment.js 관리자)가 TC39에 Temporal 제안, Stage 1</td></tr><tr><td>2021년</td><td>Stage 2.7 — 설계 확정</td></tr><tr><td>2023년</td><td>Stage 3 — 브라우저 구현 시작</td></tr><tr><td>2024년</td><td>temporal_rs(Rust 기반 공유 엔진) 개발, Google + Boa 협업</td></tr><tr><td>2025년 5월</td><td>Firefox 139, 최초로 Temporal 정식 지원</td></tr><tr><td>2026년 1월</td><td>Chrome 144, Edge 144 지원</td></tr><tr><td>2026년 3월</td><td>TC39 Stage 4 도달 — ES2026 표준 확정</td></tr></tbody></table></figure>



<p>Bloomberg의 금융 시스템에서 나노초 단위의 시간 정밀도와 IANA 타임존 지원이 필요했던 것이 Temporal 개발의 핵심 동력이었다. Bloomberg 엔지니어 Philipp Dunkel이 스펙 챔피언을, Jason Williams가 TC39 위원으로 표준화를 이끌었다.</p>



<h2 class="wp-block-heading">참고 자료</h2>



<ul class="wp-block-list">
<li><a href="https://bloomberg.github.io/js-blog/post/temporal/">Temporal: The 9-Year Journey to Fix Time in JavaScript — Bloomberg Engineering</a></li>



<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal">Temporal — MDN Web Docs</a></li>



<li><a href="https://tc39.es/proposal-temporal/">TC39 Proposal: Temporal</a></li>



<li><a href="https://caniuse.com/temporal">Temporal API — Can I Use</a></li>



<li><a href="https://thenewstack.io/es2026-solves-javascript-headaches-with-dates-math-and-modules/">ES2026 Solves JavaScript Headaches — The New Stack</a></li>
</ul>



<div class="related-posts" style="margin-top: 2em; padding: 1.2em; background: #f9f9f9; border-radius: 8px;">
<h3>함께 읽으면 좋은 글</h3>
<ul>
<li><a href="https://blog.kwt.co.kr/webmcp-%ec%9b%b9%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-ai-%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8%ec%9d%98-%ed%8c%90%ec%9d%84-%eb%b0%94%ea%be%b8%eb%8a%94-%ed%95%b5%ec%8b%ac-%ec%9f%81%ec%a0%90-3%ea%b0%80/">WebMCP, 웹브라우저 AI 에이전트의 판을 바꾸는 핵심 쟁점 3가지</a></li>
<li><a href="https://blog.kwt.co.kr/2026%eb%85%84-3%ec%9b%94-%ec%a3%bc%ec%9a%94-llm-%eb%b9%84%ea%b5%90-gpt-54-vs-claude-46-vs-gemini-3-2/">2026년 3월 주요 LLM 비교 총정리: GPT-5.4 vs Claude 4.6 vs Gemini 3</a></li>
<li><a href="https://blog.kwt.co.kr/gpt-54-%ec%b6%9c%ec%8b%9c-%ec%b4%9d%ec%a0%95%eb%a6%ac-%ec%bb%b4%ed%93%a8%ed%84%b0%eb%a5%bc-%ec%a7%81%ec%a0%91-%ec%a1%b0%ec%9e%91%ed%95%98%eb%8a%94-ai-%eb%ad%90%ea%b0%80-%eb%8b%ac%eb%9d%bc%ec%a1%8c/">GPT-5.4 출시 총정리 &amp;#8211; 뭐가 달라졌나</a></li>
</ul>
</div>
		<div class="wpulike wpulike-robeen " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="Like Button"
					data-ulike-id="1928"
					data-ulike-nonce="da62623809"
					data-ulike-type="post"
					data-ulike-template="wpulike-robeen"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_1928"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="0"></span>			</div></div>
	<p>The post <a href="https://blog.kwt.co.kr/javascript-temporal-api-9%eb%85%84-%eb%a7%8c%ec%97%90-date%eb%a5%bc-%eb%8c%80%ec%b2%b4%ed%95%98%eb%8a%94-%ec%83%88-%ed%91%9c%ec%a4%80/">JavaScript Temporal API &#8211; 9년 만에 Date를 대체하는 새 표준</a> appeared first on <a href="https://blog.kwt.co.kr"></a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kwt.co.kr/javascript-temporal-api-9%eb%85%84-%eb%a7%8c%ec%97%90-date%eb%a5%bc-%eb%8c%80%ec%b2%b4%ed%95%98%eb%8a%94-%ec%83%88-%ed%91%9c%ec%a4%80/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
