- Published on
[Javscript] Temporal ํบ์๋ณด๊ธฐ
- Authors
- Name
- zubetcha
- @zubetcha_
Temporal
Javascript์ ์๋ก์ด ๊ฐ์ฒด์ธ Temporal์ด ๋ธ๋ผ์ฐ์ ์ ์คํ์ ๋ฆด๋ฆฌ์ฆ์ ๋์ ๋๊ธฐ ์์ํ๋ค๋ ์์์ ๋ค์๋ค. Temporal์ ๋ ์ง, ์๊ฐ, ๊ธฐ๊ฐ, ์บ๋ฆฐ๋ ๋ฑ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ก ๊ธฐ์กด์ Date ๊ฐ์ฒด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
Date ๊ฐ์ฒด๊ฐ ์ฒ์ ๋ฑ์ฅํ ๊ฑด 1995๋ ์ด์๋๋ฐ, ๋น์ Java์ java.util.Date๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ ๊ฒ์ด๋ผ๊ณ ํ๋ค. Java์ Date ๊ฐ์ฒด๋ 2๋ ํ์ธ 1997๋ ์ ์๋ก์ด ๊ฒ์ผ๋ก ๋์ฒด๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ Javascript์ Date ๊ฐ์ฒด๋ ์ฒ์ ๋์ ๋ ์ด๋๋ก ํ์ฌ๊น์ง ์ฌ์ฉ๋๊ณ ์์ผ๋ ์ฝ 30 ์ฌ๋ ์ด๋ ์ง๋ ์ ์ด๋ค. ์ค๋๋ ๊ฐ์ฒด์ธ ๋งํผ ์ฌ๋ฌ ๋ฌธ์ ์ ์ ์ง๋๊ณ ์์๋ค.
Date ๊ฐ์ฒด์ ๋ฌธ์ ์
1. ์ฌ์ฉ์์ ๋ก์ปฌ ์๊ฐ๊ณผ UTC๋ง ์ง์ํ๋ฉฐ, ์๊ฐ๋(time zone) ๊ฐ๋ ์ด ์๋ค.
ํ์์กด์ ๋์ผํ ๋ก์ปฌ ์๊ฐ์ ๋ฐ๋ฅด๋ ์ง์ญ์ ์๋ฏธํ๋ค. ์ฃผ๋ก ๊ตญ๊ฐ์ ์ํด ๋ฒ์ ์ผ๋ก ์ง์ ๋๊ธฐ ๋๋ฌธ์ ํญ์ ๊ณ ์ ์ ์ด์ง ์์ผ๋ฉฐ ์ ์น์ ํน์ ๊ฒฝ์ ์ ์ธ ์ด์ ๋ก ํ์์กด์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ๋ ์๋ค.
์์ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ํ์์กด์ ์์คํ ์ ์ ์ฉํ๊ณ ํ์ฉํ๊ธฐ ์ํด์๋ ์ญ์ฌ์ ์ผ๋ก ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์ด ์๋์ง๋ฅผ ์ ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ค์ํ๋ฐ, ํ์ฌ ๊ฐ์ฅ ์ ๋ขฐ๋ฐ๋ ํ์ค์ IANA time zone databaseย ์ด๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค๊ณผ ์ญ์ฌํ์๋ค์ ์ปค๋ฎค๋ํฐ์ ์ํด ๊ด๋ฆฌ๋๊ณ ์์ผ๋ฉฐ, ๋ณ๊ฒฝ ์ด๋ ฅ์ด ์ถ๊ฐ์ ์ผ๋ก ๋ฐ๊ฒฌ๋๊ฑฐ๋ ์ ๋ถ ์ ์ฑ ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐ๋ก ๊ฐฑ์ ํด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ ํ๋๊ฐ ๋์ ๋ง์ ์ ๋ขฐ๋ฅผ ๋ฐ๊ณ ์๋ค๊ณ ํ๋ค. ๋ฆฌ๋ ์ค, macOS ๋ฑ์ ์ ๋์ค ๊ธฐ๋ฐ OS๋ ์๋ฐ, PHP ๋ฑ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ด๋ถ์ ์ผ๋ก๋ IANA time zone database๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
Javascript์์๋ ์ค์น๋ OS์ ์ค์ ๋ ํ์์กด์ ๋ฐ๋ฅด๊ฒ๋ ๋์ด ์์ผ๋ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ECMAScript์๋ ๋ก์ปฌ ํ์์กด์ด๋ DST์ ๋ํ ์ค๋ช ๋ ๊ฐ๋ตํ๊ฒ๋ง ์ ๋ฆฌ๋์ด ์๋ค. Javascript ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ํ์ค ์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ช ์ธ ๋ํ ๋์ ์์ง ์๊ณ IANA Time Zone Database ์ฌ์ฉ์ ๊ถ์ฅํ๋ค๋ ๋ฌธ๊ตฌ๋ง ์์ ๋ฟ์ด๋ค.
An implementation dependent algorithm using best available information on time zones to determine the local daylight saving time adjustment DaylightSavingTA(t), measured in milliseconds. An implementation of ECMAScript is expected to make its best effort to determine the local daylight saving time adjustment.
NOTE : It is recommended that implementations use the time zone information of the IANA Time Zone Databaseย http://www.iana.org/time-zones/.
2. ๋ ์ง ํ์ฑ์ด ๋ถ์์ ํ๋ค.
Date ๊ฐ์ฒด๋ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ด์ง ๊ฐ์ ๋ ์ง๋ก ํ์ฑํด์ฃผ๋ parse()
๋ผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. parse()๋ ํ๋ผ๋ฏธํฐ๋ก ๋ ์ง๋ฅผ ํํํ๋ ๋ฌธ์์ด์ ๋ฐ๋๋ฐ, ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํด์ ์ ํจํ ๋ ์ง ๊ฐ์ธ ๊ฒฝ์ฐ UTC ์ดํ์ ๋ฐ๋ฆฌ์ธ์ปจ๋ ์๋ฅผ ๋ฐํํ๊ฑฐ๋, ์ ํจํ์ง ์๋ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ NaN์ ๋ฐํํ๋ค.
Date.parse('2025-02-11') // 1739232000000
Date.parse('zubetcha') // NaN
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, Date.parse() ๋ฉ์๋๊ฐ ๊ตฌ๋ฌธ์ ๋ถ์ํ๋ ๋ฐฉ์์ด ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅผ ์ ์๋ค๋ ๊ฒ์ด๋ค. MDN์์๋ ES5๊น์ง๋ Date.parse()๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
๋ช ๊ฐ์ง ๋ ์ง ํฌ๋งท ๊ตฌ๋ถ ๋ถ์์ ์ฐจ์ด๋ฅผ ์์๋ก ๋ค์ด๋ณด์๋ฉด,
- ISO 8601 ํ์์ ๊ตฌ๋ฌธ ๋ถ์ ์ฐจ์ด
ISO 8601 ํ์์ ๋ ์ง๋ง ์ธ์๋ก ์ ๋ฌํ๋ฉด UTC ์๊ฐ๋๋ก ์ฒ๋ฆฌํ์ง๋ง, ๋ ์ง ๋ฐ ์๊ฐ๊น์ง ์ ๋ฌํ๋ฉด ๋ก์ปฌ ์๊ฐ๋๋ก ์ฒ๋ฆฌํ๋ค.
// ๋ ์ง ํ์
const utc = Date.parse('2025-02-17') // 1739750400000
// ๋ ์ง ๋ฐ ์๊ฐ ํ์
const local = Date.parse('2025-02-17T00:00:00') // 1739718000000
// ๋ฐํ๊ฐ์ ์๊ฐ์ฐจ
const offset = (utc - local) / 1000 / 60 / 60 // 9
- ๋ ์ง๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ํ์์ ๋ถ์ ์ฐจ์ด
์ฐ์ , Date.parse()๊ฐ ์ธ์๋ก ๋ฐ์ ์ ์๋ ํ์์ ํฌ๊ฒ RFC 2822์ ISO 8601 ๋ ๊ฐ์ง๊ฐ ์๋ค. RFC 2822๋ ์ด๋ฉ์ผ ํค๋์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, Day, DD Mon YYYY HH:MM:SS +ZZZZ
์ ํ์์ ๊ฐ์ง๋ค. ISO 8601์ ๊ตญ์ ํ์ค ๋ ์ง ํ์์ผ๋ก์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ๋ค์ํ ๋ณํ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ ๊ฐ์ง๋ค.
// RFC2822
Mon, 17 Feb 2025 15:30:00 +0900
Tue, 08 Jun 2021 11:45:00 -0400
Fri, 24 Dec 2021 23:59:59 +0000
// ISO 8601
2025-02-17T15:30:00+09:00 (ํ์ค ํ์, ์๊ฐ ํฌํจ)
2025-02-17 (๋ ์ง๋ง ํ๊ธฐ)
2025-02-17T06:30:00Z (Z๋ UTC ํ์์กด์ ์๋ฏธ)
Date.parse()๋ ์ธ์๋ก ์ด๋ค ํ์์ ๋ ์ง ๋ฌธ์์ด์ด ์ ๋ฌ๋๋์ง์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ตฌ๋ฌธ์ ๋ถ์ํ๋ค. RFC 2822์ ํ์์ ๋ก์ปฌ ์๊ฐ๋๋ก ๋ถ์ํ๊ณ , ISO 8601์ UTC ์๊ฐ๋๋ก ๋ถ์ํ๋ค. ์๋์ ์์๋ฅผ ๋ณด๋ฉด ๋ ํ์ ๋ค ๋ ์ง๊น์ง๋ง ๋ํ๋ด๊ณ ์์ง๋ง Date.parse()๊ฐ ์ฒ๋ฆฌํ์ฌ ๋ฐํํ ๊ฐ์ ๋ค๋ฅด๋ค๋ ๊ฑธ ์ ์ ์๋ค.
// ISO 8601
const iso = Date.parse('2025-02-17') // 1739750400000
// RFC 2822
const rfc = Date.parse('February 17, 2025') // 1739718000000
// ๋ฐํ๊ฐ์ ์๊ฐ์ฐจ
const offset = (iso - rfc) / 1000 / 60 / 60 // 9
- ๋ธ๋ผ์ฐ์ ๋ฐ ์ ๋ฌ๋ ๊ฐ์ ๋ฐ๋ฅธ ์ ํจ ํ์ ์ฐจ์ด
Date.parse()๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ด ๋ ์ง๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด ํ์์ธ์ง๋ฅผ ํ๋ณํ์ฌ ์ ํจํ ๊ฐ ๋๋ NaN์ ๋ฐํํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๋ง๋ค ๊ตฌ๋ฌธ ๋ถ์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค ๋ณด๋ ๋์ผํ ์ ํจํ์ง ์์ ๊ฐ์์๋ ๋ถ๊ตฌํ๊ณ ์ด๋ ๊ฒฝ์ฐ์๋ NaN์ ๋ฐํํ์ง ์๊ธฐ๋ ํ๋ค.
// 35์ผ์ ์กด์ฌํ์ง ์๋ ๋ ์ง์ด๋ค.
// Chrome
Date.parse('35/02/2025') // NaN
// Safari
Date.parse('35/02/2025') // 2228742000000
// foo-bar์ ๋ ์ง๊ฐ ์๋๋ค.
// Chrome
Date.parse('foo-bar 2025') // 1735657200000
// Safari
Date.parse('foo-bar 2025') // NaN
3. Date ๊ฐ์ฒด ์์ฒด๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ(mutable)ํ์ฌ ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
Date ๊ฐ์ฒด๋ mutableํ๋ค. ์๋์น ์๊ฒ ์๋ณธ์ ์ฐธ์กฐํ์ ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์๋ณธ๊น์ง ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
const originalDate = new Date()
const newDate = originalDate
newDate.setFullYear(2000)
console.log(originalDate) // Thu Feb 17 2000 17:48:57 GMT+0900 (ํ๊ตญ ํ์ค์)
console.log(newDate) // Thu Feb 17 2000 17:48:57 GMT+0900 (ํ๊ตญ ํ์ค์)
4. ์๋จธํ์(DST) ๋ฐ ์ญ์ฌ์ ์ธ ์บ๋ฆฐ๋ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๋ณต์กํ ๊ณ์ฐ์ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
5. ๊ทธ๋ ๊ณ ๋ฆฌ ๋ฌ๋ ฅ์ ์ง์ํ์ง ์๋๋ค.
๋ง์ ๊ฐ๋ฐ์๋ค์ด ์์ ๊ฐ์ ๋ฌธ์ ๋ค๋ก ์ธํด javascript ๊ธฐ๋ฐ ํ๋ก์ ํธ์์ ๋ ์ง๋ฅผ ๋ค๋ฃฐ ๋ momentjs, date-fns ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ๋ ํ๋ค.
Temporal ํบ์๋ณด๊ธฐ
์ฃผ์ ํน์ง
Temporal์ ๊ธฐ์กด์ Date ๊ฐ์ฒด๋ฅผ ์์ ํ ๋์ฒดํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๋ฐ๋ผ์ ์์์ ์ธ๊ธํ Date ๊ฐ์ฒด์ ๋จ์ ๋ค์ ๋ณด์ํ๋ฉฐ, ๋ ์ง ๋ฐ ์๊ฐ์ ์ฒ๋ฆฌํ ๋ ๊ฐ๋ฐ์๊ฐ ์์ธก ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ก๋ค.
- ํ์์กด๊ณผ ๊ทธ๋ ๊ณ ๋ฆฌ ์บ๋ฆฐ๋๋ฅผ ์ง์ํ๋ค.
- ๋ณํ(conversion), ๋น๊ต(comparison), ์ฐ์ฐ(computation), ํฌ๋งทํ (formatting) ๋ฑ์ ์ฝ 200๊ฐ์ ๋ค์ํ ๋ด์ฅ ๋ฉ์๋ ์ ๊ณตํ๋ค.
์ฝ์ด ์ปจ์
Temporal์ ์ฝ์ด ์ปจ์ ์ผ๋ก๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
- ์๊ฐ(Instant): ์ญ์ฌ์ ํน์ ํ ํ ์์
- ๋ฒฝ์๊ณ ์๊ฐ(Wall-clock Time): ์ง์ญ(time zone)๋ณ๋ก ๋ค๋ฅด๊ฒ ํํ๋๋ ์๊ฐ
- ๊ธฐ๊ฐ(Duration): ๋ ์์ ๊ฐ์ ์ฐจ์ด
Temporal์ API ๊ตฌ์กฐ๋ ์์ ์ปจ์ ์ ๋ฐ๋ผ ์ค๊ณ๋์๋ค๊ณ ํ๋ค.
๊ฐ๋ | Temporal ๊ฐ์ฒด | ์ค๋ช |
---|---|---|
์๊ฐ(Instant) | Temporal.Instant | UTC ๊ธฐ์ค์ ํน์ ์์ |
์๊ฐ๋ ํฌํจ๋ ๋ ์ง/์๊ฐ | Temporal.ZonedDateTime | ์๊ฐ๋ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ ์ง/์๊ฐ |
์๊ฐ๋ ์์ (Plain) | Temporal.PlainDateTime | ๋ ์ง์ ์๊ฐ์ ํํ (์๊ฐ๋ ์์) |
Temporal.PlainDate | ์ฐ, ์, ์ผ๋ง ํํ | |
Temporal.PlainYearMonth | ์ฐ, ์๋ง ํํ | |
Temporal.PlainMonthDay | ์, ์ผ๋ง ํํ | |
Temporal.PlainTime | ์๊ฐ๋ง ํํ | |
ํ์ฌ ์๊ฐ | Temporal.now | ํ์ฌ ์๊ฐ์ ๋ค์ํ ํ์์ผ๋ก ์ ๊ณต |
๊ธฐ๊ฐ | Temporal.Duration |
ref.
JavaScript Temporal is coming | MDN Blog
[JS]ํ์์กด๊ณผ Date ๋ค๋ฃจ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์์กด ๋ค๋ฃจ๊ธฐ (1) : NHN Cloud Meetup
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์์กด ๋ค๋ฃจ๊ธฐ (2) : NHN Cloud Meetup