# * 날짜와 시간
자바스크립트의 Date 객체의 기능은 (만든이 : Ken Smith) 자바언어에서 java.util.Date를 가져온 것과 비슷하다.
우리가 사용하는 그레고리력의 시간보다, 컴퓨터는 초 단위로 나타내는게 이상적이고 쉽다.
0초는 1970년 1월 1일 0시 0분 0초 (UTC)
세계는 타임존으로 나뉘어져 있고, 오전 8시가 아침, 오후 8시가 저녁인 것 또한 어느 곳에 가든지 같다는 사실 또한, 타임존으로 나뉘어져 있기 때문이다.
타임존은 UTC (Coordinated Universal Time)를 기준으로 한 시차로 나뉘어진다. UTC 는 다른 표현으로 그리니치 표준시 GMT (Greenwich Mean Time) 으로도 불리기도 한다.
var now = new Date();
console.log(now);
// Mon May 20 2019 23:14:55 GMT+0900 (한국 표준시)
2
3
자바스크립트 new Date()
명령으로 나오는 값은 UTC로 부터의 시차 기준과, 타임존 (GMT+0900) 이름 '한국 표준시' (= KST) 로 나오는 것을 볼 수 있다.
자바스크립트 Date 인스턴스는 모두 유닉스 시간 원점으로부터 몇 밀리초가 지났는지를 나타내는 숫자이고, 이 숫자를 사람이 읽기 편한 그레고리력 날짜로 변환하여 보여준다.
now.valueOf(); // 1558361695416
now
에 담긴 Date 인스턴스를 valueOf() 메서드를 이용하여서 숫자형 표현으로도 쓸 수 있다.
# Date 객체 생성예제
new Date(); // 현재 날짜
// 월은 0 부터 시작 0 ~ 11
new Date(2019, 0); // 2019년 1월 1일 0시
new Date(2019, 10, 12, 13, 7, 7, 700); // 2019년 11월 12일 오후 1시 7분 7.7초
// 유닉스 타임스탬프로 날짜 생성
new Date(0); // Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시)
new Date(9858361695416); // Fri May 26 2282 18:48:15 GMT+0900 (한국 표준시) {}
// 유닉스 타임스탬프 이전의 날짜 생성
new Date( -365*24*60*60*1000 * 10 ); // Mon Jan 04 1960 08:30:00 GMT+0830 (한국 표준시)
// 날짜 문자열 해석 (표준시를 기준으로 한다)
new Date('November 12, 2019 GMT-0000') // Tue Nov 12 2019 09:00:00 GMT+0900 (한국 표준시)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 자바스크립트 Date 객체의 문제
가장 큰 문제 중 하나로, 자바스크립트는 타임존을 명시할 방법이 없다. Date 객체는 항상 내부적으로는 UTC 기준으로 저장하지만 출력할 때 운영체제에서 정의한 표준시에 맞게 변환을 하기 때문이다.
위 문제점 때문에, 노드 JS 처럼 자바스크립트를 서버로 가져가서 코딩할 경우에는 Moment.js 라이브러리 (타임존 지원) 을 쓴다.
# 서버에서 날짜 생성
서버에서 날짜를 생성할때는 꼭 UTC를 사용하거나, 타임존을 명시해야한다. 만약 특정지역을 기준으로 날짜를 생성한다면, 클라우드 기반으로 애플리케이션을 운영하면 똑같은 코드가 전 세계 모든 곳에서 실행되는 상황이기 때문에 특정지역을 기준으로 날짜를 생성할 경우 큰 골칫거리가 생기게 된다.
const test = new Date(Date.UTC(2019, 4, 19));
console.log(test); // Sun May 19 2019 09:00:00 GMT+0900 (한국 표준시)
2
Note
Date.UTC 는 Date의 매개변수를 똑같이 받지만, 새 Date 인스턴스를 반환하지 않고 해당 날짜의 숫자형 값을 반환한다.
# 날짜 데이터 전송
서버에서 브라우저를 날짜로 전성 또는 서버에서 날짜를 받을 경우 그리고 서버와 브러우저가 서로 다른 타임존에 있을 경우 (당연히 유저는 자신을 기준으로 날짜를 보고 싶어한다.) 위 2가지 경우가 복잡하지는 않다. 자바스크립트가 UTC를 기준으로 유닉스 타임스탬프를 저장하기 때문에 Date 객체를 그대로 전송해도 일반적으로 안전하다 하지만 확실한 방법은 JSON을 사용하는 것이 좋다.
const before = {
date : new Date()
};
before.date instanceof Date // true
const json = JSON.stringify(before);
const after = JSON.parse(json);
after.date instanceof Date // false
typeof after.date // string
2
3
4
5
6
7
8
위 결과처럼 JSON.stringify
가 된 Date 객체는 다시 parse로 풀어도 문자열로 바뀌지만 날짜 Date 메서드를 다시 사용해서 복구는 가능하다.
after.date = new Date(after.date);
after.date instanceof Date // true
2
어떤 타임존의 날짜이든지, JSON 인코드 된 UTC 날짜이므로 복구가 가능하다.
# 요약
- 자바스크립트의 날짜는 1970년 1월 1일 UTC로부터 몇 밀리초가 지났는지 숫자로 나타낸다.
- 날짜 형식을 자유롭게 바꿔서 사용하고 싶다면 Moment.js를 사용하는게 좋다.
- 날짜 데이터 생성할 때는 타임존을 주의해야한다.