모던 자바스크립트 (자료구조와 자료형) 3-6. Date 객체와 날짜
Date 객체
: 날짜를 저장하거나 제어하는 객체
- new Date()
: 현재 날짜와 시간이 저장된 객체 생성
- new Date(milliseconds)
: UTC 기준 1970년 1월 1일 0시 0분 0초에서 밀리초(1/1000초) 후의 시점이 저장된 Date 객체 생성
: 1970년 1월 1일 이전의 날짜는 음수로 표현
// 31 Dec 1969
let Dec31_1969 = new Date(-24 * 3600 * 1000);
alert( Dec31_1969 );
※ 타임스탬프
: UTC 기준 1970년 1월 1일 0시 0분 0초를 기준으로 흘러간 밀리초 (1/1000초)
: 12 * 30 * 24 * 60 * 60 * 1000
- new Date("date string")
: "2022-04-03" 형식으로 date string을 넣어 원하는 날짜에 대한 date 객체 생성
: 해당 문자열은 date.parse를 통해 자동으로 구문분석 (parsed) 됨
: 코드가 실행되는 컴퓨터의 시간대에 맞춰서 시간이 생성됨
let date = new Date("2017-01-26");
alert(date);
- new Date(year, month, date, hours, minutes, seconds, ms)
: 주어진 인수를 조합하여 원하는 날짜에 대한 date 객체 생성
: 코드가 실행되는 컴퓨터의 시간대에 맞춰서 시간이 생성됨
: year는 반드시 네 자리 숫자여야 함
: month는 0(1월)부터 11(12월) 사이의 숫자여야 함
: date는 일을 나타내는데, 값이 없는 경우엔 1일로 처리 됨
: hours/minutes/seconds/ms에 값이 없는 경우엔 0으로 처리됨
let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 2011년 1월 1일, 02시 03분 04.567초
날짜 구성요소 얻기
- getFullYear()
: 연도(네 자릿수)를 반환
: getYear()의 경우 두 자리 수 연도를 반환할 수 있으므로 사용지양
- getMonth()
: 월을 반환 (0 이상 11 이하)
- getDate()
: 일을 반환 (1 이상 31 이하)
- getHours(), getMinutes(), getSeconds(), getMilliseconds()
: 시, 분, 초, 밀리초를 반환
- getDay()
: 일요일을 나타내는 0부터 토요일을 나타내는 6까지의 숫자 중 하나를 반환
- UTC 기준 날짜 구성 반환
: getUTCFullYear()
: getUTCMonth()
: getUTCDay()
※ 현지 시간대가 UTC 시간대와 다르다면 아래 예시를 실행했을 때 얼럿창엔 다른 값이 출력됨
// 현재 일시
let date = new Date();
// 현지 시간 기준 시
alert( date.getHours() );
// 표준시간대(UTC+0, 일광 절약 시간제를 적용하지 않은 런던 시간) 기준 시
alert( date.getUTCHours() );
- getTime()
: 주어진 일시와 1970년 1월 1일 00시 00분 00초 사이의 간격(밀리초 단위)인 타임스탬프를 반환
: UTC 기준 반환 메서드 없음
- getTimezoneOffset()
: 현지 시간과 표준 시간의 차이(분)를 반환합니다.
: UTC 기준 반환 메서드 없음
// UTC-1 시간대에서 이 예시를 실행하면 60이 출력됩니다.
// UTC+3 시간대에서 이 예시를 실행하면 -180이 출력됩니다.
alert( new Date().getTimezoneOffset() );
날짜 구성요소 설정
- setFullYear(year, [month], [date])
- setMonth(month, [date])
- setDate(date)
- setHours(hour, [min], [sec], [ms])
- setMinutes(min, [sec], [ms])
- setSeconds(sec, [ms])
- setMilliseconds(ms)
- setTime(milliseconds)
: 1970년 1월 1일 00:00:00 UTC부터 밀리초 이후를 나타내는 날짜를 설정)
※ setTime()을 제외한 모든 메서드는 setUTCHours()같이 표준시에 따라 날짜 구성 요소를 설정해주는 메서드가 있음
※ setHours와 같은 메서드는 여러 개의 날짜 구성요소를 동시에 설정할 수 있는데,
메서드의 인수에 없는 구성요소는 변경되지 않음
let today = new Date();
today.setHours(0);
alert(today); // 날짜는 변경되지 않고 시만 0으로 변경됩니다.
today.setHours(0, 0, 0, 0);
alert(today); // 날짜는 변경되지 않고 시, 분, 초가 모두 변경됩니다(00시 00분 00초).
Date 객체의 자동 고침 기능
: 범위를 벗어나는 값을 설정하려고 할 시 자동으로 값이 수정 됨
let date = new Date(2013, 0, 32); // 2013년 1월 32일은 없습니다.
alert(date); // 2013년 2월 1일이 출력됩니다.
let date = new Date(2016, 0, 2); // 2016년 1월 2일
date.setDate(1); // 1일로 변경합니다.
alert( date ); // 01 Jan 2016
date.setDate(0); // 일의 최솟값은 1이므로 0을 입력하면 전 달의 마지막 날을 설정한 것과 같은 효과를 봅니다.
alert( date ); // 31 Dec 2015
Date 객체를 숫자로 변경해 시간차 계산하기
: Date 객체를 숫자형으로 변경하면 타임스탬프가 됨
let date = new Date();
alert(+date); // 타임스탬프(date.getTime()를 호출한 것과 동일함)
// 시간측정
let start = new Date(); // 측정 시작
// 원하는 작업을 수행
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // 측정 종료
alert( `반복문을 모두 도는데 ${end - start} 밀리초가 걸렸습니다.` );
Date.now()
: date 객체를 만들지 않고도 시간을 측정하는 방법
: new Date().getTime()과 같지만 중간에 date 객체를 만들지 않아도 됨
let start = Date.now(); // 1970년 1월 1일부터 현재까지의 밀리초
// 원하는 작업을 수행
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = Date.now(); // done
alert( `반복문을 모두 도는데 ${end - start} 밀리초가 걸렸습니다.` ); // Date 객체가 아닌 숫자끼리 차감함
벤치마크 테스트
: 특정 함수들을 실행 하는데 걸리는 시간을 측정하여 함수의 성능을 측정
: 모던 자바스크립트 엔진은 자주 실행되는 코드인 hot code를 대상으로 최적화를 수행
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를 각 함수(diffSubtract, diffGetTime)별로 10번씩 돌립니다.
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
alert( 'diffSubtract에 소모된 시간: ' + time1 );
alert( 'diffGetTime에 소모된 시간: ' + time2 );
// 메인 반복문 실행 전, "예열용"으로 추가한 코드
bench(diffSubtract);
bench(diffGetTime);
// 벤치마크 테스트 시작
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
Date.parse(str)와 문자열
: Date.parse(str)을 사용하면 문자열에서 날짜를 읽어올 수 있음
- 문자열 형식
: YYYY-MM-DDTHH:mm:ss.sssZ
: YYYY-MM-DD = 날짜(연-월-일)
: "T" = 구분 기호로 쓰임
: HH:mm:ss.sss = 시:분:초.밀리초
'Z'(옵션) = +-hh:mm 형식의 시간대를 나타냄. Z 한 글자인 경우엔 UTC+0을 나타냄
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (타임스탬프)
Refference
https://ko.javascript.info/date