Temporal API는 특히 Temporal.ZonedDateTime 객체를 통해 날짜를 생성할 때 큰 이점을 제공합니다. 이 객체의 주요 특징 중 하나는 일광 절약 시간제(DST)와 같은 복잡한 상황을 포함하여 시간대를 쉽게 처리할 수 있다는 점입니다.
예를 들어, 다음과 같이 Temporal.ZonedDateTime 객체를 생성할 때 정확한 시간대와 함께 날짜와 시간을 설정할 수 있습니다.
const zonedDateTime = Temporal.ZonedDateTime.from({
year: 2024,
month: 8,
day: 16,
hour: 12,
minute: 30,
second: 0,
timeZone: 'Europe/Madrid'
});
단순히 날짜와 시간을 설정하는 것이 아니라, 지정된 시간대 내에서 정확하게 날짜가 표현되도록 보장하는 것입니다. 이를 통해 일광 절약 시간제(DST) 변화나 다른 지역의 시간 조정에도 불구하고, 항상 정확한 시간을 반영할 수 있습니다.
이 기능은 특히 여러 지역에서 일관성을 유지해야 하는 이벤트 스케줄링이나 로그 기록에 강력합니다.
시간대를 날짜 생성 과정에 직접 포함시킴으로써, 일광 절약 시간제(DST) 변화나 시간대 차이로 인한 예기치 않은 시간 변동을 피할 수 있습니다. 이로 인해 Temporal API는 단순한 편리함을 넘어, 글로벌 시간 일관성이 중요한 현대 웹 개발에서 필수적인 도구가 됩니다.
이 API의 우수성에 대해 더 궁금하시다면, 시간대 정의 변경에 대처하는 방법을 설명한 이 아티클을 참조하세요.
ZonedDateTime 객체는 두 날짜를 비교하는 compare 라는 정적 메서드를 제공합니다. 이 메서드는 첫 번째 날짜가 두 번째 날짜보다 작으면 -1, 같으면 0, 크면 1을 반환합니다.
이 메서드는 특히 일광 절약 시간제(DST) 종료 후 같은 시간이 반복되는 상황과 같은 복잡한 경우에도 정확하게 날짜를 비교할 수 있습니다.
const one = Temporal.ZonedDateTime.from('2020-11-01T01:45-07:00[America/Los_Angeles]');
const two = Temporal.ZonedDateTime.from('2020-11-01T01:15-08:00[America/Los_Angeles]');
Temporal.ZonedDateTime.compare(one, two);
// => -1
// (because `one` is earlier in the real world)
ZonedDateTime 객체에는 몇 가지 미리 계산된 속성이 있습니다.
예를 들어, hoursInDay 속성은 해당 시간대에서 하루의 시작(보통 자정)부터 다음 달력일 시작까지의 실제 시간을 반환합니다. 이 속성을 통해 시간대와 일광 절약 시간제(DST)와 같은 복잡한 시간 계산을 쉽게 처리할 수 있습니다.
Temporal.ZonedDateTime.from('2020-01-01T12:00-08:00[America/Los_Angeles]').hoursInDay;
// => 24
// (normal day)
Temporal.ZonedDateTime.from('2020-03-08T12:00-07:00[America/Los_Angeles]').hoursInDay;
// => 23
// (DST starts on this day)
Temporal.ZonedDateTime.from('2020-11-01T12:00-08:00[America/Los_Angeles]').hoursInDay;
// => 25
// (DST ends on this day)
다른 멋진 attribute 로는 daysInYear, inLeapYear 이 있습니다.
ZonedDateTime 객체는 .withTimeZone 메서드를 제공하여 원하는 대로 시간대를 변경할 수 있습니다. 이를 통해 특정 시간대에서 다른 시간대로 쉽게 전환할 수 있으며, 시간대 변환 시 일관된 결과를 얻을 수 있습니다.
zdt = Temporal.ZonedDateTime.from('1995-12-07T03:24:30+09:00[Asia/Tokyo]');
zdt.toString(); // => '1995-12-07T03:24:30+09:00[Asia/Tokyo]'
zdt.withTimeZone('Africa/Accra').toString(); // => '1995-12-06T18:24:30+00:00[Africa/Accra]'
ZonedDateTime의 .add 메서드를 사용하면 달력 연산을 통해 기간의 날짜 부분을 추가할 수 있습니다.
이 메서드는 해당 시간대의 규칙에 따라 자동으로 일광 절약 시간제(DST)를 조정합니다. 달력 연산과 단순 기간 연산 모두 지원되기 때문에 다양한 시간 계산을 쉽게 처리할 수 있습니다.
날짜를 추가하거나 뺄 때, 일광 절약 시간제(DST) 변환이 있더라도 시계 시간이 일관되게 유지되어야 합니다.
예를 들어, 토요일 오후 1시에 약속이 있고, 이를 하루 뒤로 변경할 경우, 다음 날 약속 시간도 여전히 오후 1시가 되어야 합니다.
이는 DST 변환이 있어도 시간의 일관성을 유지하기 위함입니다.
기간의 시간 부분을 더하거나 뺄 때는 일광 절약 시간제(DST) 변환을 무시해야 합니다.
예를 들어, 친구와 2시간 후에 만나기로 했는데, 1시간 일찍 또는 3시간 늦게 나타나면 친구가 불쾌할 수 있습니다.
시간 연산은 항상 일정한 시간 차이를 유지해야 하며, DST 변환이 결과에 영향을 주지 않아야 합니다.
연산의 순서는 일관되고 예측 가능해야 하며, 일광 절약 시간제(DST) 전환 시 발생할 수 있는 모호성은 자동으로 처리되어야 합니다.
결과가 DST 전환에 가깝거나 포함될 경우에도, 충돌 없이 결정론적으로 처리되어야 합니다.
zdt = Temporal.ZonedDateTime.from('2020-03-08T00:00-08:00[America/Los_Angeles]');
// Add a day to get midnight on the day after DST starts
laterDay = zdt.add({ days: 1 });
// => 2020-03-09T00:00:00-07:00[America/Los_Angeles]
// Note that the new offset is different, indicating the result is adjusted for DST.
laterDay.since(zdt, { largestUnit: 'hour' }).hours;
// => 23
// because one clock hour lost to DST
laterHours = zdt.add({ hours: 24 });
// => 2020-03-09T01:00:00-07:00[America/Los_Angeles]
// Adding time units doesn't adjust for DST. Result is 1:00AM: 24 real-world
// hours later because a clock hour was skipped by DST.
laterHours.since(zdt, { largestUnit: 'hour' }).hours; // => 24
Temporal API의 .until 메서드는 두 ZonedDateTime 객체 간의 시간을 계산하고, 그 차이를 Temporal.Duration 객체로 반환합니다. 만약 두 번째 시간이 첫 번째 시간보다 이전이라면, 결과는 음수가 됩니다.
기본 옵션을 사용할 경우, 반환된 Temporal.Duration을 원래의 ZonedDateTime에 더하면 두 번째 시간과 동일한 시간이 됩니다.
이 메서드는 간단해 보일 수 있지만, 전체 사양을 읽어보면 그 미묘한 차이를 이해할 수 있습니다.
Temporal API는 자바스크립트에서 시간을 처리하는 방식을 혁신적으로 변화시킵니다. 이 글에서는 인간이 읽을 수 있는 날짜와 UTC 날짜의 차이, 그리고 Temporal.ZonedDateTime 객체가 정확하게 전자를 표현하는 방법을 간략히 설명했습니다.