자바스크립트 Date 함수의 타임존
new Date('2021-12-31 23:59:59')
위의 코드에서 Date 함수에 전달된 문자열이 어느 지역의 시간인지 굼금해서 살펴봤다. 리눅스에서 node를 사용하고 있음으로
node
Welcome to Node.js v14.0.0.
아래 명령으로 어느 지역의 시간(타임존)인지 확인할 수 있다.
file /etc/localtime
/etc/localtime: symbolic link to /usr/share/zoneinfo/Asia/Seoul
아시아 서울이다. 아래 문자열은 아시아 서울에서의 시간을 의미한다.
'2021-12-31 23:59:59'
코드를 수행하면
new Date('2021-12-31 23:59:59')
2021-12-31T14:59:59.000Z
전달된 문자열과 다른 값을 가지고 있는 것을 확인할 수 있다. 그러면 문자열로 변환해 보자.
new Date('2021-12-31 23:59:59').toString()
'Fri Dec 31 2021 23:59:59 GMT+0900 (대한민국 표준시)'
이젠 동일한 동일한 문자열을 표시한다. 그런데 ‘GMT+0900’ 라는 문자열이 눈에 들어온다. 그리니치 천문대 지역 시간 기준으로 서울과의 시간 차이를 구분한 것이다. 아시아 서울의 타임존은 그리니치 평균시에서 9시를 더하면 된다는 뜻이다. 그러면 이 코드가 문자열로 변환되기 전 아래 데이터는 어떤 의미인가?
2021-12-31T14:59:59.000Z
UTC 시간이다. Date 함수는 UTC (GMT와 같은 의미로 사용) 값을 내부에 가지고 있다가 toString 함수가 호출되면 타임존을 계산해서 표시한다.
(https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date) 그럼 아래 명령은 어떨까?
new Date('2021-12-31 23:59:59').toUTCString()
'Fri, 31 Dec 2021 14:59:59 GMT'
결과 문자열은 new Date 가 내부에 가지고 있는 아래 값과 동일하다.
2021-12-31T14:59:59.000Z
친절하게도 함수 이름에 UTC가 포함되어 있다. 그렇다면 타임존을 바꾸면 어떻게 될까? 쉘에서 아래 명령을 수행한 후
export TZ=Asia/Calcutta
아래 명령을 node에서 수행하자.
new Date('2021-12-31 23:59:59')
2021-12-31T18:29:59.000Z
new Date('2021-12-31 23:59:59').toString()
'Fri Dec 31 2021 23:59:59 GMT+0530 (인도 표준시)'
new Date('2021-12-31 23:59:59').toUTCString()
'Fri, 31 Dec 2021 18:29:59 GMT'
아시아 인도 시간으로 인식하고 GMT와 5시간 30분 차이가 나는 것을 알 수 있다. Date 함수에 인자를 주지 않으면 현재 시간을 돌려주는데 혹시 이때 그 동작 방식이 달라질까?
const d = new Date()
undefined
d
2021-09-17T13:23:36.636Z
d.toString()
'Fri Sep 17 2021 22:23:36 GMT+0900 (대한민국 표준시)'
d.toUTCString()
'Fri, 17 Sep 2021 13:23:36 GMT'
아니다, 동일하다. 타임존이 아시아 서울임으로 현재 시간에서 9시를 뺀 시간을 내부에 UTC 시간으로 가지고 있다.
Date 함수에 시간 문자열을 전달할 경우 타임존에 의존한다. 서버와 주고받는 시간과 계산에 사용되는 시간은 모두 UTC 기준의 timestamp를 사용하고 사용자에게 보여줄 경우에만 타임존을 적용한 시간 문자열을 사용하는 것이 더 명확하고 간편하다.