시간이 같은데요, 달라졌습니다. 다른데요, 같아졌습니다 - DST🌞편

Seungyeon Choi·2022년 5월 6일
0

캘린더개발

목록 보기
1/2

DST는 Daylight Saving Time의 약자로, 우리가 흔히 아는 썸머타임이다.

DST가 시작되면 시간은 시차값이 +1이 되고, 해제되면 다시 -1이 된다.

시간은 계속 일정하게 흐른다.
DST가 적용되는 순간에 시간을 더 빨리 흐르게 할 수도 없고..
우리는 어떻게 DST를 이용할까?

이 답을 생각해 보기 전에 시간이 절대적인 개념임을 확인해보자.

같은 순간에 전 세계인에게 "지금 몇시야?"를 물었다.
자신의 위치에 따라서 그 답은 달라질 것이다.

(DST 적용 안되었을 때)
한국의 오전 9시는
영국의 자정이고,
뉴욕의 오후 8시이다.

왜 다를까?

시각은 특정 시점의 해석이기 때문이다.

우리나라는 UTC+9타임존을 사용해서, UTC로부터 9를 더해 사용하고,
영국은 UTC+0 이므로, UTC를 그대로 사용하고,
뉴욕은 UTC-4이므로, UTC로부터 4를 빼서 사용한다.

그래서 DST는 어떻게 이용할 수 있는지 생각해보자.

모두가 가지고 있는 시계를 움직이면 된다.
즉, DST가 시작되면 시계를 1시간 이후로 밀고, 해제되면 시계를 1시간 뒤로 당기면 되는 것이다.

반복 기간에 DST가 적용되면 어떻게 될까?
더 많은 햇빛을 이용하기 위해 시간을 당긴만큼, 회의 시간도 당겨야할까?

그럴필요 없다.

이미 손목시계의 시간을 1시간 후로 밀었기 때문이다.

즉 매일 오전 9시에 열리는 회의를 그대로 9시에 하더라도,
DST가 적용된 날짜의 9시는 적용되기 전 8시를 나타내므로 이미 DST의 역할을 다한 것이다.

RFC5545에서도 반복 인스턴스를 계산할 때 date만 달라지고 local-time은 동일하게 유지한다.

Weekly until December 24, 1997:

	DTSTART;TZID=America/New_York:19970902T090000
    RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z

 	==> (1997 9:00 AM EDT) September 2,9,16,23,30;
                           October 7,14,21
		(1997 9:00 AM EST) October 28;
                           November 4,11,18,25;
                           December 2,9,16,23

여기서 한가지 더 의문점이 생긴다.

local-time을 유지할 경우, 그 시간이 없을 때도 있지 않을까?
다시 말해, STANDARD -> DST가 될 때 없어지는 시간은 어떻게 표현할 것인가.

예시를 들어보자.

뉴욕은 2022년 3월 14일 AM 02시에 DST가 시작된다.
그러면, 뉴욕에서 2022년 3월 14일 01시 59분 59초 AM에서 1초 뒤는 2022년 3월 14일 03시 00초 AM가 된다.
뉴욕에서 2022년 3월 14일 02시 00분 AM은 없다.

만약, 3월 14일 02:00이 반복 인스턴스에 포함되는 반복일정을 만들면 어떻게 표현해야할까?

RFC5545는 그 답을 알려준다.

RRULE프로퍼티의 데이터 타입인 RECUR의 설명을 보자.

If the computed local start time of a recurrence instance does not exist, or occurs more than once, for the specified time zone, the time of the recurrence instance is interpreted in the same manner as an explicit DATE-TIME value describing that date and time, as specified in Section 3.3.5.

특정 타임존에 대해 반복 인스턴스가 존재하지 않거나(STANDARD -> DST), 2번 이상 계산된 경우(DST->STANDARD) DATE-TIME 타입의 명세를 따른다.

If, based on the definition of the referenced time zone, the local time described occurs more than once (when changing from daylight to standard time), the DATE-TIME value refers to the first occurrence of the referenced time. Thus, TZID=America/New_York:20071104T013000 indicates November 4, 2007 at 1:30 A.M. EDT (UTC-04:00).
If the local time described does not occur (when changing from standard to daylight time), the DATE-TIME value is interpreted using the UTC offset before the gap in local times. Thus, TZID=America/New_York:20070311T023000 indicates March 11, 2007 at 3:30 A.M. EDT (UTC-04:00), one hour after 1:30 A.M. EST (UTC-05:00).

즉, 반복 인스턴스를 나타낼 수 없으면, UTC offset을 이용해 읽으면 된다.

따라서 TZID=America/New_York:20220314T020000 은 2022년 3월 14일 03:00 AM EDT 로 나타낼 수 있다.

생각해보면 당연하다.

2022년 3월 14일 01:59:59 AM 뉴욕에서는 모두 시계를 한 시간 후로 미룰 준비를 끝마쳤을 것이고, 02:00:00AM이 되는 찰나에 한 시간을 밀어서 03:00:00 AM이 되게 할 것이다.

따라서, 2022년 3월 14일의 반복인스턴스는 캘린더에 03:00AM으로 표현해야 한다.
02:00 AM ~ 02:59 AM의 일정은 +1 되어 03:00 AM ~ 03:59 AM 으로 표현한다.

그럼 다시 여기서 의문이 한가지 생길 것 이다.
새벽 2시 반복도 새벽 3시로 표현된다면, 원래 있던 새벽 3시 반복 일정이랑 겹치지 않을까?

그렇다.

이것은 DST를 사용했을 때 감수해야하는 부분이다.

profile
캘린더 만드는 개발자입니당

0개의 댓글