LHJ

I'm a FE developer.

15.1 날짜, 타임존, 타임스탬프, 유닉스 시간

22 May 2020 » js_lj

15.1 날짜, 타임존, 타임스탬프, 유닉스 시간

까놓고 말해, 우리가 쓰는 그레고리안 달력은 형편없습니다.
지나치게 복잡하고, 시간을 나누는 기준도 모호한 데다가 윤년까지 있습니다.
타임존은 한술 더 뜨죠.
하지만 현실이 그러니 어쩔 수 없이 적응해야 합니다.

우선 단순한 초(second)부터 시작합시다.
그레고리력 시간은 지나치게 복잡하게 나눠 놨지만, 초 단위는 이해하기 쉽습니다.
날짜와 시간을 초로 나타내면 단 하나의 숫자가 되므로 컴퓨터 입장에서는 이상적입니다.
하지만 사람과 얘기할 때 초 단위로 얘기하는 건 무리수입니다.
“이봐, 1493607600초에 점심 같이 하겠나?” 같이 얘기할 사람은 없겠죠(1493607600초는 2017년 5월 1일 정오입니다).
날짜를 초 단위로 나타낼 수 있다면, 0초는 언제일까요?
예수 탄생일을 생각하는 사람이 있겠지만, 사실은 1970년 1월 1일 0시 0분 0초(UTC)입니다.

이미 알고 있겠지만 세계는 타임존으로 나뉩니다.
어디에 살든 오전 7시는 아침이고 오후 7시가 저녁인 건 타임존 때문입니다.
타임존은 상당히 복잡한 문제이며, 서머타임이 결부되면 더 복잡합니다.
필자는 이 책에서 그레고리력과 타임존을 상세히 설명할 생각은 없습니다.
이에관한 정보가 필요한 독자는 위키배과에 잘 정리된 내용이 있으니 참고하시기 바랍니다.
다만 자바스크립트 Date 객체와 Moment.js를 이해하는 데 필요한 기본적인 내용은 다룰 겁니다.

타임존은 모두 UTC(Coordinated Universal Time)를 기준으로 한 시차로 나뉩니다(약자가 좀 이상해 보일 텐데, 이런 약자가 붙은 복잡하고도 우스꽝스러운 정치적 이유는 위키백과에서 읽어볼 수 있습니다).
UTC는 때때로 그리니치 표준시, 즉 GMT(Greenwich Mean Time)라고 불리기도 합니다.
예를 들어 필자는 현재 오리건 주에 살고 있는데, 오리건은 태평양 타임존에 속합니다.
태평양 타임존은 UTC보다 7~8시간 뒤에 있습니다.
잠깐, 7~8시간?
무슨 말이죠?
계절에 따라 다릅니다.
여름에는 서머타임이 적용되고 시차는 7시간입니다.
여름이 아닐 때는 8시간의 시차가 적용됩니다.
하지만 여기서 중요한 것은 타임존을 암기하는 것이 아니라, 시차를 어떻게 표현하느냐입니다.
필자가 자바스크립트 터미널을 열고 new Date() 명령을 내리면 다음과 같은 결과가 나옵니다.

Fri Mar 24 2017 13:21:59 GMT+0900 (KST)

노드와 브라우저에서 결과물이 다르네..

복잡해 보이지만, 타임존이 UTC로부터의 시차 기준으로도 나오고(GMT+0900) 타임존 이름으로도 나오는 걸 볼 수 있습니다(KST).

자바스크립트에서 Date 인스턴스는 모두 유닉스 시간 원점(Unix Epoch)으로부터 몇 밀리초가 지났는지 나타내는 숫자입니다.

역주_
이후 유닉스 타임스탬프라고 표기하겠습니다.

자바스크립트는 보통 이 숫자를 사람이 읽기 편한 그레고리력 날짜로 변환합니다.
숫자형 표현이 필요하면 valueOf() 메서드를 쓰면 됩니다.

const d = new Date();
console.log(d);             // 타임존이 들어간 그레고리력 날짜
console.log(d.valueOf());   // 유닉스 타임스템프

노드랑 브라우저랑 비교해봤는데 시간은 차이 안나는거 같음. 그냥 내보내는 형식이 다른듯