모던 JavaScript 튜토리얼을 따라가면서 정리합니다.
자바스크립트에서는 Date 객체를 사용해 날짜와 시간을 나타낸다.
Date
객체에는 ‘날짜만’ 혹은 ‘시간만’ 저장하는 것은 불가능하고, 항상 날짜와 시간이 함께 저장된다.Date 객체 생성 방법
new Date()
new Date(milliseconds)
: 1970년의 첫날을 기준으로 흘러간 밀리초(타임스탬프)를 사용한다.new Date(dateString)
: ex)"2017-01-01"
. 인수가 하나인데 문자열이라면 해당 문자열은 자동으로 구문 분석(parsed) 된다.new Date(year, month, date, hours, minutes, seconds, ms)
year
: 네 자리 숫자month
:0
부터11
사이의 숫자date
: 값이 없는 경우엔 1일로 처리hours/minutes/seconds/ms
에 값이 없는 경우엔0
으로 처리
월은
0
부터 시작한다. (0은 1월을 나타낸다.)날짜 구성 요소 얻기
getFullYear()
getMonth()
getDate()
: 일을 반환getHours()
,getMinutes()
,getSeconds()
,getMilliseconds()
getDate()
: 요일 역시 0부터 시작한다. (0은 일요일을 나타낸다.)- 위 메서드 이름에 있는
get
다음에UTC
를 붙여주면 표준시 기준의 날짜 구성 요소를 반환해주는 메서드를 만들 수 있다. getTime()
: 주어진 일시와 1970년 1월 1일 00시 00분 00초 사이의 간격인 타임스탬프를 반환한다.getTimezoneOffset()
: 현재 시간과 표준 시간의 차이(분)를 반환
범위를 넘어가는 구성요소를 설정하려 할 때
Date
자동 고침(autocorrection)이 활성화된다. 이를 이용하면 월/일/시간을 쉽게 날짜에 추가하거나 뺄 수 있다.1 2
let date = new Date(2013, 0, 32); // 1월 32일은 없다 alert(date); // 2013년 2월 1일이 출력된다.
입력받은 날짜 구성 요소가 범위를 벗어나면 초과분은 자동으로 다른 날짜 구성 요소에 배분된다.
날짜끼리 빼는 것도 가능한데, 이때 두 날짜의 밀리초 차이가 반환된다. 이게 가능한 이유는
Date
가 숫자형으로 바뀔 때 타임스탬프가 변환되기 때문이다.Date.now()
를 사용하면Date
객체를 만들지 않고도 현재 시각의 타임스탬프를 빠르게 구할 수 있다.new Date().getTime()
과 의미론적으로 동일하다.벤치마크 테스트
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
function diffSubtract(date1, date2) { return date2 - date1; } function diffGetTime(date1, date2) { return date2.getTime() - date1.getTime(); } function bench(f) { let date1 = new Date(0); let date2 = new Date(); let start = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); return Date.now() - start; } let time1 = 0; let time2 = 0; // 함수 bench를 각 함수별로 10번씩 돌린다. for (let i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); } alert( 'diffSubtract에 소모된 시간: ' + time1 ); alert( 'diffGetTime에 소모된 시간: ' + time2 );
bench(diffSubtract)
를 실행하고 있을 때 CPU가 어떤 작업을 병렬적으로 처리하고 있고, 여기에 CPU의 자원이 투입되고bench(diffGetTime)
을 실행할 땐 이 작업이 끝난 상태라고 가정해보자. 멀티 프로세스를 지원하는 운영체제에서 이런 시나리오는 흔히 발생한다. 따라서 **신뢰할만한 벤치마크 테스트를 만들기 위해benchmark
를 번갈아가며 여러 번 돌린다. **형변환이 없어서 엔진 최적화에 드는 자원이 줄어들으므로
getTime()
을 이용한 방법이 훨씬 빠르다.모던 자바스크립트 엔진은 아주 많이 실행된 코드인 ‘hot code’를 대상으로 최적화를 수행한다(실행 횟수가 적은 코드는 최적화할 필요가 없다 2)
자바스크립트의 타임스탬프는 초가 아닌 밀리초 기준이다.