티스토리 뷰

JavaScript

Date

song 2022. 9. 21. 18:29

 

javascript에서 Date object를 다루다보면 헷갈릴 때가 있다. server와 client, 개발하는 local pc에 따라 timezone이 달라지고 그에 따른 시간 차이가 발생할 수 있기 때문이다.

 

컴퓨터의 시간

컴퓨터는 1970년 1월 1일 0시 0분 0초(UTC 기준)를 기준으로 흐른 시간을 초단위로 계산하여 저장한다(그 이전의 경우 음수로). 이를 Unix time이라고 부르며, 같은 순간에는 전 세계 어디에서 호출해도 같은 값을 갖게 된다.

Date.now() // 1663752244577
new Date(Date.now()) // Wed Sep 21 2022 18:24:04 GMT+0900 (한국 표준시)

 

Date는 왜 헷갈리나?

Javascript의 Date class의 헷갈림은 입력과 출력에서 유발된다. Date 객체를 생성할 때 같은 날짜를 입력으로 넣더라도 format에 따라 현지의 시간을 나타내는 것인지, UTC를 나타내는 것인지가 달라지고 그에 따라 생성되는 date의 값(위에서 말한 1970년 이후로 흐른 초)이 달라진다. 또한 같은 값을 갖는 Date 객체일지라도 사용하는 method에 따라 현지의 시간으로 출력할지, UTC를 기준으로 출력할지가 다르다.

 

입력

1. 시간대와 상관 없는 입력

// 시간대를 직접 명시
new Date('1970-01-01 UTC+3') // Thu Jan 01 1970 06:00:00 GMT+0900 (한국 표준시)
new Date('Jan 1 1970 UTC+09:20') // Wed Dec 31 1969 23:40:00 GMT+0900 (한국 표준시)

2. 현지의 시각으로 인식하는 입력

// 1. 년, 월, 일, (시, 분, 초)를 각각 입력
new Date(1970, 0, 1) // Thu Jan 01 1970 00:00:00 GMT+0900 (한국 표준시)

// 2. RFC 2822 format으로 입력
new Date('Jan 1 1970') // Thu Jan 01 1970 00:00:00 GMT+0900 (한국 표준시)

// 3. Z 없이 ISO 8601 format으로 입력
new Date('1970-01-01T00:00:00') // Thu Jan 01 1970 00:00:00 GMT+0900 (한국 표준시)

3.  UTC 시각으로 인식하는 입력

// 1. 유닉스 타임 입력
new Date(0) // Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시) === Thu, 01 Jan 1970 00:00:00 GMT

// 2. Z를 붙여서 or 'YYYY-MM-DD'로 ISO 8601 format으로 입력
new Date('1970-01-01T00:00:00z') // Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시) === Thu, 01 Jan 1970 00:00:00 GMT
new Date('1970-01-01') // Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시) === Thu, 01 Jan 1970 00:00:00 GMT

 

출력

1. 현지의 시각으로 출력

const date = new Date('1970-01-01') // zero unix time

// UTC 시간으로 출력하는 methods
date.getUTCFullYear(); // 1970
date.getUTCMonth(); // 0
date.getUTCDate(); // 1
date.getUTCDay(); // 4 (목)
date.getUTCHours(); // 0
date.getUTCMinutes(); // 0
date.getUTCSeconds(); // 0
date.getUTCMilliseconds(); // 0

date.toISOString(); // '1970-01-01T00:00:00.000Z'
date.toJSON(); // '1970-01-01T00:00:00.000Z'
date.toGMTString(); // 'Thu, 01 Jan 1970 00:00:00 GMT'
date.toUTCString(); // 'Thu, 01 Jan 1970 00:00:00 GMT'

2. UTC 시각으로 출력

const date = new Date('1970-01-01') // zero unix time

// 현지 시간으로 출력하는 methods
date.getFullYear(); // 1970
date.getMonth(); // 0
date.getDate(); // 1
date.getDay(); // 4 (목요일)
date.getHours(); // 9 <-- 한국시간으로 9시!
date.getMinutes(); // 0
date.getSeconds(); // 0
date.getMilliseconds(); // 0

date.toString(); // 'Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시)'
date.toDateString(); 'Thu Jan 01 1970'
date.toLocaleString(); // '1970. 1. 1. 오전 9:00:00'
date.toLocaleDateString(); // '1970. 1. 1.'
date.toLocaleTimeString(); // '오전 9:00:00'
date.toTimeString(); // '09:00:00 GMT+0900 (한국 표준시)'

 

Summary

  1. Date는 결국 unix time을 담는 number이다.
  2. 입력의 format을 신경써서 입력 날짜가 UTC로 인식되는지, 현지 시간으로 인식되는지 신경 써야한다.
  3. unix time을 어떤 timezone으로 출력할지 신경써서 method를 사용하자.

'JavaScript' 카테고리의 다른 글

Lazy loading (Intersection observer vs scroll event)  (0) 2022.12.27
JS execution optimization  (0) 2022.10.11
Regular function vs arrow function  (0) 2022.08.01
var, let, const  (0) 2022.08.01
Execution context, scope chain  (0) 2022.08.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함