Posts 모던 자바스크립트 #5.11 Date 객체와 날짜
Post
Cancel

모던 자바스크립트 #5.11 Date 객체와 날짜

모던 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)

  • 자바스크립트의 타임스탬프는 초가 아닌 밀리초 기준이다.

This post is licensed under CC BY 4.0 by the author.

모던 자바스크립트 #5.10. 구조 분해 할당

그리디(Greedy): 기지국 설치 문제

Loading comments from Disqus ...