Programming/JavaScript

모던 자바스크립트 (자료구조와 자료형) 3-6. Date 객체와 날짜

2mukee 2022. 4. 3. 19:24
320x100
320x100

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

 

300x250
728x90