ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Group Study, 모던 자바스크립트 Deep Dive] - 30 Date
    Front-end/Javascript 2022. 12. 28. 15:41
    반응형

    Group study background

    나만 그런건지는 모르겠지만, 실무를 하다보면 잊어버리는 개념들이 있다.

    가끔 FE 뉴비나 novice인분들에게 질문을 받는데, 아리송 할때만큼 쪽팔릴때가 없었다.

    인간은 망각의 동물이라고 교수님께서 말씀하셨지만 반복 학습의 힘을 믿는다. React 오픈카톡방에서 모집한 스터디원분들과 함께 "모던 자바스크립트 Deep Dive" 1권 톺아보기를 시작한다!

     

    정보 전달용이 아닌 개인 스터디 레코딩용 포스트입니다.


    30. Date

    표준 빌트인 객체인 Date는 날짜와 시간(연, 월, 일, 시,분, 초, 밀리초(ms, 천분의 1초)을 위한 메서드를 제공하는 빌트인 객체이면서 생성자 함수다.

    UTC(협정 세계시;Coordinated Uiversal Time)는 국제 표준시를 말한다. UTC는 GMT(그리니치 평균시;Greenwich Mean Time)로 불리기도 한다. UTC와 GMT는 초의 소수점 단위에서만 차이가 나기 떄문에 일상에서는 혼용되어 사용되고 기술적인 표기로는 UTC가 사용된다.

    KST(한국 표준시;Korea Standard Tiem)는 UTC에 9시간을 더한 시간이다. 

    JS에서 Date 함수가 은근히(?) 중요한 이유는 개발자들이 자주 실수하는 것 중 하나이기도 하다. 그리고 back to the basic 때문인지 라이브 코딩에서 종종 출제가 되기도 한다(실제 경험담). moment나 dayjs(현재는 이것을 많이 사용)을 사용하다보면 Date 함수를 잊기 쉽기 때문에 다시 톺아보는것도 필요할것 같다.


    30.1 Date 생성자 함수

    Date 생성자 함수로 생성한 Date 객체는 내부적으로 날짜와 시간을 나타내는 정수값을 갖느다. 이 값은 1970년 1월 1일 00:00:00(UTC)을 기점으로 Date 객체가 나타내는 날짜와 시간까지의 밀리초를 나타낸다. 

    예를 들어 1970년 1월 1일 0시를 기점으로 하루가 지난 "1970년 1월 2일 0시"를 나타내는 Date 객체는 내부적으로 정수값 86,400,200(24h*60m*60s*1000ms)을 갖는다.

     

    30.1.1 new Date()

    Date 생성자 함수를 인수 없이 new 연산자와 함께 호출하면 현재 날짜와 시간을 갖는 Date 객체를 반환한다. Date 객체는 내부적으로 날짜와 시간을 나타내는 정수값을 갖지만 콘솔에 출력하면 기본적으로 날짜와 시간 정보를 출력한다.

    [예제 30-01]

    new Date(); // Mon Jul 06 2020 01:03:18 GMT+0900 (대한민국 표준시)

    Date 생성자 함수를 new 연산자 없이 호출하면 Date 객체 대신 날짜와 시간 정보를 나타내는 문자열을 반환한다.

    [예제 30-02]

    Date(); // "Mon Jul 06 2020 01:03:18 GMT+0900 (대한민국 표준시)"

     

    30.1.2 new Date(milliseconds)

    Date 생성자 함수에 Number 타입의 밀리초를 인수로 전달하면 1970년 1월 1일 00:00:00(UTC)을 기점으로 인수로 전달된 밀리초만큼 경과한 날짜와 시간을 나타내는 Date 객체를 반환한다.

    [예제 30-03]

    new Date(0); // -> Thu Jan 01 1970 09:00:00 GMT+0900 (대한민국 표준시)
    
    
    /*
    1s = 1,000ms
    1m = 60s * 1,000ms = 60,000ms
    1h = 60m * 60,000ms = 3,600,000ms
    1d = 24h * 36,000,000ms = 86,400,000ms
    */
    
    new Date(8640000); // -> Fri Jan 02 1970 09:00:00 GMT+0900 (대한민국 표준시)

     

    30.1.3 new Date(dateString)

    Date 생성자 함수에 날짜와 시간을 나타내는 문자열을 인수로 전달하면 지정된 날짜와 시간을 나타내는 Date 객체를 반환한다. 이 인수 문자열은 Date.parse 메서드에 의해 해석 가능한 형식이어야 한다.

    [예제 30-04]

    new Date('May 26, 2020 10:00:00')
    // -> Tue May 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
    
    new Date('2020/03/26/10:0:00')
    // -> Thu May 26 2020 10:00:00 GMT+0900 (대한민국 표준시)

     

    30.1.4 new Date(year, montth[, day, hour, minute, second, millisecond])

    Date 생성자 함수에 연, 월, 일, 시, 분, 초, 밀리초를 의미하는 숫자를 인수로 전달하면 지정된 날짜와 시간을 나타내는 Date 객체를 반환한다. 연, 월은 반드시 지정해야 한다.

    [예제 30-05]

    // 월을 나타내는 2는 3월을 의미한다. 2020/3/1/00:00:00:00
    new Date(2020,2);
    // -> Sun Mar 01 2020 00:00:00 GMT+0900 (대한민국 표준시)
    
    // 월을 나타내는 2는 3월을 의미한다. 2020/3/26/10:00:00:00
    new Date(2020, 2, 26,10,00,00,0)
    // -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
    
    //다음처럼 표현하는 것이 가독성이 더 좋다
    new Date('2020/03/26/10:00:00:00')
    // -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)

     


    30.2 Date 메서드

    30.2.1 Date.now

    1970년 1월 1일 00:00:00(UTC)을 기점으로 현재 시간까지 경과한 밀리초를 숫자로 반환한다.

    [예제 30-06]

    Date.now() // 153971539112

     

    30.2.2 Date.parse

    1970년 1월 1일 00:00:00(UTC)을 기점으로 인수로 전달된 지정시간(new Date(datestring)의 인수와 동일한 형식)까지의 밀리초를 숫자로 반환한다.

    [예제 30-07]

    //UTC
    Date.parse('Jan 2, 1970 00:00:00 UTC') // -> 86400000
    
    //KST
    Date.parse('Jan 2 9170 09:00:00') // -> 86400000
    
    //KST
    Date.parse('1970/01/02/09:00:00') // -> 86400000

    30.2.3 Date.UTC

    1970년 1월 1일 00:00:00(UTC)을 기점으로 인수로 전달된 지정 시간까지의 밀리초를 숫자로 반환한다.

    30.2.21 Date.prototype.setTimezoneOffset

    UTC와 Date 객체에 지정된 locale 시간과의 차이를 분 단위로 반환한다. KST는 UTC에 9시간을 더한 시간이므로 UTC = KST -9h

     

    [예제 30-08]

    const today = new Date()
    
    today.getTimezoneOffset() / 60 // -> 9

    30.2.24 Date.prototype.toISOString

    ISO 8601 형식으로 Date 객체의 날짜와 시간을 표현한 문자열을 반환한다.

    [예제 30-09]

    const today = new Date('2020/7/24/12:30')
    
    today.toString(); // Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 효준시)
    today.toISOString() // 2020-07-24T03:30:00.00

    30.2.25 Date.prototype.toLocaleString

    인수로 전달한 Locale 기준으로 Date 객체의 날자와 시간을 표현한 문자열을 반환한다.

    [예제 30-10]

    const today = new Date('2020/07/24/12:30')
    
    today.toString() // Fri Jul 24 2020 12:30:00 GMT+0900(대한민국 표준시)
    today.toLocaleString(); // 2020. 7. 24. 오후 12:30:00
    today.toLocaleString('ko-KR'); // 2020. 7. 24. 오후 12:30:00
    today.toLocaleString('en-US'); // 7/24/2020, 12:30:00 PM
    today.toLocaleString('ja-JP'); // 2020/7/24 12:30:00

    30.2.25 Date.prototype.toLocaleTimeString

    인수로 전달한 locale 기준으로 Date 객체의 시간을 표현한 문자열을 반환한다. 

    [예제 30-11]

    const today = new Date('2020/07/24/12:30')
    
    today.toString() // Fri Jul 24 2020 12:30:00 GMT+0900(대한민국 표준시)
    today.toLocaleTimeString(); // 오후 12:30:00
    today.toLocaleTimeString('ko-KR'); // 오후 12:30:00
    today.toLocaleTimeString('en-US'); // 12:30:00 PM
    today.toLocaleTimeString('ja-JP'); // 12:30:00

    30.3 Date를 활용한 시계 예제

    아래 예제 이외에도 특정시간과의 차이를 나타내는 즉시 실행 함수를 만들어보는 것도 유용할 것 같다.

    [예제 30-12]

    (function printNow() {
     const today = new Date()
     
     const dayNames = [
      '(일요일)',
      '(월요일)',
      '(화요일)',
      '(수요일)',
      '(목요일)',
      '(금요일)',
      '(토요일)',
     ]
     
      const day = dayNames[today.getDay()]
      
      const year = today.getFullYear()
      const month = today.getMonth() + 1
      const date = today.getDate();
      let hour = today.getHours()
      let minute = today.getMinutes()
      let second = today.getSeconds()
      
      const ampm = hour >= 12 ? 'PM' : 'AM'
      
      // 12시간제로 변경
      hour %= 12;
      hour = hour || 12 // hour이 0이면 12를 재할당
      
      // 10 미만인 분과 초를 2자리로 변경
      minute = minute < 10 ? '0' + minute : minute
      second = second < 10 ? '0' + second : second
      
      const now = `${year}년 ${month}월 ${date}일 ${day} ${hour}:${minute}:${second} ${ampm}`
      
      console.log(now)
      
      // 1초마다 printNow 함수를 재귀 호출한다.
      setTimeout(printNow, 1000);
      
      
    }())

     

    반응형

    댓글

Designed by Tistory.