시간대, UTC 오프셋, 그리고 UTC를 저장해야 하는 이유
UTC 오프셋과 시간대의 차이, 일광 절약 시간이 오프셋을 신뢰할 수 없게 만드는 이유, 그리고 대부분의 날짜 버그를 막는 규칙. UTC를 저장하고 경계에서 변환합니다.
"도쿄는 지금 몇 시인가요?"는 답이 하나뿐인 질문처럼 들립니다. 하지만 소프트웨어는 이를 끊임없이 틀립니다. 회의 시각이 한 시간 어긋나고, 일광 절약 시간이 바뀐 뒤 타임스탬프가 어긋나며, 로그와 데이터베이스가 서로 다른 값을 말합니다. 거의 모든 원인은 두 가지 서로 다른 것을 혼동하는 데로 거슬러 올라갑니다. 하나는 UTC로부터의 고정된 오프셋이고, 다른 하나는 연중 오프셋이 바뀌는 이름 붙은 시간대입니다. 이 구분을 바로잡으면 대부분의 날짜 처리가 해결됩니다.
UTC가 기준입니다
UTC(협정 세계시)는 전 세계의 기준 시계입니다. UTC는 일광 절약 시간을 따르지 않으며 결코 바뀌지 않습니다. 다른 모든 지역 시각은 UTC를 기준으로 한 오프셋으로 표현됩니다. 일본은 UTC+9이고, 뉴 욕은 겨울에 UTC-5입니다. UTC는 "같은 순간"을 어디서나 표현할 수 있게 해 주는 기준점이며, 그래서 저장해야 할 대상입니다.
오프셋은 시간대가 아닙니다
이것이 핵심적인 혼동입니다. UTC+9는 오프셋, 즉 고정된 시간
수입니다. Asia/Tokyo는 시간대, 즉 어떤 오프셋이 언제 적용되는지에
대한 규칙을 가진 이름 붙은 지역입니다. 이 차이가 중요한 이유는 많은
시간대가 연중 오프셋을 바꾸기 때문입니다.
America/New_York은 겨울에 UTC-5이고 일광 절약 시간 동안에는 여름에 UTC-4입니다.Asia/Tokyo는 일 년 내내 UTC+9이며, DST가 없습니다.
따라서 뉴욕 이벤트에 "UTC-5"를 저장하면 한 해의 절반은 틀립니다.
America/New_York을 저장하면 올바른데, 시간대가 자신의 DST 규칙을 알고 있기 때문입니다.
오프셋은 한 시점의 스냅숏이고, 시간대는 규칙집입니다.
일광 절약 시간이 오프셋을 무너뜨리는 지점입니다
DST는 시간 버그의 가장 큰 단일 원인인데, 오프셋이 특정 날짜에 바뀌고 그 전환일에는 뜻밖의 일들이 있기 때문입니다.
- 봄에는 시계가 앞으로 뜁니다. 오전 2시 30분 같은 지역 시각은 전환일에 존재하지 않습니다.
- 가을에는 시계가 뒤로 물러납니다. 오전 1시 30분이 두 번 발생하므로 지역 타임스탬프가 모호해집니다.
고정 오프셋으로 저장된 미래 회의는 DST 변경의 반대편에서 한 시간 어긋납니다. 시간대 이름과 지역 시각으로 저장하면 그 날짜에 적용되는 규칙으로 UTC 변환이 계산되므로 올바르게 유지됩니다.
IANA 시간대 데이터베이스
Europe/London 같은 시간대 이름은 IANA 시간대
데이터베이스(tz 또는 zoneinfo라고도 부릅니다)에서 옵니다. 이는 시간대를
역사적·현재 오프셋 규칙에 매핑하는 공유 데이터셋입니다. 정부가 DST 정책이나
오프셋을 바꿀 때마다 연중 여러 차례 갱신되며, 그래서 런타임의 tz 데이터를
최신으로 유지하는 일이 중요합니다. 이름 규칙에 유의하세요.
시간대는 Region/City(America/Sao_Paulo)이며, 한 나라가 여러
시간대에 걸칠 수 있으므로 국가가 아니라 대표 도시를 사용합니다.
대부분의 버그를 막는 규칙
UTC를 저장하세요. 지역 시각으로의 변환은 경계에서만, 즉 사용자에게 표시할 때만 하고, 나중에 사용자의 지역 시각을 재구성해야 할 때는 오프셋이 아니라 사용자의 시간대 이름을 저장하세요.
이 한 가지 원칙이 문제의 전체 부류를 피하게 해 줍니다. 내부적으로는 모든 것이 UTC이므로 비교, 정렬, 산술이 모호하지 않습니다. 표시 시점의 변환은 시간대의 현재 규칙을 사용합니다. 예외는 미래의 지역 이벤트입니다. 이를테면 내년 3월의 오전 9시 치과 예약 같은 경우, 지역 시각과 시간대 이름을 보관하고 UTC로의 해소를 늦게 해야 하는데, 그때까지 DST 규칙이 바뀔 수도 있기 때문입니다.
타임스탬프가 Unix 에포크 값이라면 그것은 정의상 이미 UTC입니다. 1970-01-01 UTC 이후의 초 단위이며 시간대가 붙어 있지 않습니다. 이는 Unix 타임스탬프와 2038 문제와 함께 이해할 가치가 있는 점입니다. 한 순간을 여러 시간대에서 한꺼번에 비교하려면, 저희 세계 시간 도구가 여러 시간대의 현재 시각을 DST를 포함한 오프셋과 함께 보여 주므로, "여기는 오후 3시"가 다른 곳에서는 새벽임을 한눈에 볼 수 있습니다.