11장(2). 자바스크립트 표준 라이브러리 (날짜와 시간, JSON 직렬화)
11.4 날짜와 시간
Date 객체는 Date()
생성자로 생성한다. 인자가 없으면 현재 날짜와 시간을 나타내는 Date 객체를 반환한다.
let now = new Date(); // 현재 시간
Date()
생성자에 숫자 인자(n)를 전달하면,
1970년 1월 1일 0시 0분 0초에서 n 밀리초 지난 것으로 간주하고 그 값을 출력한다.
let epoch = new Date(0) // Midnight, January 1st, 1970, GMT
두 개 이상의 정수 인자를 전달하면 다음과 같이 실행한 지역의 시간대에 맞게 연, 월, 일, 시, 분, 초, 밀리초로 해석한다.
Date API에서 까다로운 점은 월은 0부터 시작하지만 일은 1부터 시작한다는 것이다.
시간 관련 매개변수를 생략하면 Date()
생성자는 기본 값으로 전부 0을 사용한다.
기억할 점은 Date()
생성자에 숫자를 여러 개 전달하면 이들을 컴퓨터의 시간대를 기준으로 해석한다는 점이다.
UTC(협정 세계시, GMT라고도 한다.) 기준으로 날짜와 시간을 지정하고 싶으면 Date.UTC()
를 사용하자.
이 정적 메서드는 Date()
생성자와 같은 인자를 받아 이를 UTC 기준으로 해석하고 Date()
생성자에 전달할 수 있는 밀리초 타임 스탬프를 반환한다.
날짜를 UTC로 출력하려면 toUTCString()
이나 toISOString()
메서드를 호출해 명시적으로 문자열을 변환해야 한다.
Date()
생성자에 문자열을 전달하면 날짜와 시간 명세에 맞게 분석한다.
생성자는 toString()
, toUTCString()
, toISOString()
메서드가 반환하는 문자열의 형식을 분석할 수 있다.
Date 객체의 연도를 가져오거나 수정할 때는
getFullYear()
, getUTCFullYear()
, setFullYear()
, setUTCFullYear()
메서드를 사용한다.
let d = new Date();
d.setFullYear(d.getFullYear() + 1); // 연도를 1 늘린다.
FullYear를 Month, Date, Hours, Minutes, Seconds, Milliseconds로 바꿔서 사용할 수 있다.
setFullYear()
와 setUTCFullYear()
는 선택적으로 월과 일 또한 수정할 수 있다.
setHours()
와 setUTCHours()
는 선택적으로 분, 초, 밀리초 필드를 수정할 수 있다.
'일'을 가져오는 메서드는 getDate()
와 getUTCDate()
이다. getDay()
와 getUTCDay()
메서드는 요일을 반환한다.
(0은 일요일, 6은 토요일. 요일은 읽기 전용)
11.4.1 타임스탬프
Date 객체의 getTime()
메서드는 UTC 1970년 1월 1일로부터 현재까지 몇 밀리초 지났는지를 정수로 반환한다.
setTime()
메서드는 그 값을 수정한다. 다음과 같이 Date 객체에 30초를 더할 수 있다.
d.setTime(d.getTime() + 30000);
이들 밀리초 값을 타임스탬프라고 부르기도 하며, Date 객체보다는 타임스탬프를 직접 사용하는 것이 편리할 때도 있다.
정적 메서드 Date.now()
는 현재 시간을 타임스탬프로 반환하며 코드가 실행될 때 얼마나 오래 걸리는지 확인할 때 유용하게 사용된다.
let startTime = Date.now();
veryVeryComplicateFunction(); // 시간이 걸리는 작업
let endTime = Date.now();
console.log(`This task took ${endTime - startTime}ms.`)
11.4.3 날짜 문자열 형식과 분석
let d = new Date(2020, 0, 1, 17, 10, 30); // 2020년 1월 1일 오후 5시 10분 30초
d.toString() // => "Wed Jan 01 2020 17:10:30 GMT-0800
// (Pacific Standard Time)
d.toUTCString() // => "Thu, 02 Jan 2020 01:10:30 GMT"
d.toLocaleDateString() // => "1/1/2020": 'en-US' 로케일
d.toLocaleTimeString() // => "5:10:30 PM": 'en-US' 로케일
d.toISOString() // => "2020-01-02T01:10:30.000Z"
toString()
로컬 시간대를 사용하지만 지역에 맞는 형식을 사용하지는 않는다.
toUTCString()
UTC 시간대를 사용하지만 지역에 맞는 형식을 사용하지는 않는다.
toISOString()
ISO 8601 표준인 연-월-일 시:분:초:밀리초 형식으로 반환된다. 글자 T를 사용해 날짜 부분과 시간 부분을 구분한다.
시간은 UTC 기준이며 출력 마지막 Z 글자가 이를 나타낸다.
toLocaleString()
로컬 시간대를 사용하며 지역에 맞는 형식을 사용한다.
toDateString()
날짜 부분만 반환한다. 로컬 시간대를 사용하지만 지역에 맞는 형식을 사용하지는 않는다.
toLocaleDateString()
날짜 부분만 반환한다. 로컬 시간대를 사용하며 지역에 맞는 형식을 사용한다.
toTimeString()
시간 부분만 반환한다. 로컬 시간대를 사용하지만 지역에 맞는 형식을 사용하지는 않는다.
toLocaleTimeString()
시간 부분을 로컬시간대를 사용하여 지역에 맞는 형식으로 반환한다.
Date.parse()
문자열을 인자로 받아와 날짜와 시간을 분석하고 타임스탬프로 반환한다. Date()
생성자가 분석할 수 있는 문자열이라면 모두 분석할 수 있다.
11.6 JSON 직렬화와 분석
데이터 구조를 바이트나 문자 스트림으로 변환하는 것을 직렬화(serialization, marshaling, pickling)라고 부른다.
JSON은 '자바스크립트 객체 표기법'의 약어이며 숫자, 문자열, 불, null, 배열, 객체의 변환을 지원한다.
JSON은 맵, 세트, 정규 표현식, Date, 형식화 배열은 지원하지 않는다.
보통 JSON.stringify()
와 JSON.parse()
에는 인자 하나만 전달하지만, 선책 사항인 두 번째 인자를 전달해 JSON 형식을 변형할 수도 있다. JSON.stringify()
는 선택사항인 세 번째 인자도 받을 수 있다.
세 번째 인자를 전달하면 데이터를 여러 행 형식으로 변환한다. 세 번째 인자가 숫자면 들여쓰기가 필요할 때 그 수만큼 스페이스를 써서 들여 쓴다. 세 번째 인자가 `\t`
같은 공백 문자열이면 들여 쓸 때마다 그 문자를 사용한다.
let o = {s: "test", n: 0};
JSON.stringify(o, null, 2) // => '{\n "s":"test",\n. "n": 0\n}'
JSON.parse()
는 공백을 무시하므로 JSON.stringify()
에 전달한 세 번째 인자는 문자열을 데이터 구조로 변환할 때 아무런 영향을 주지 않는다.