ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • J정말S싫어요 스터디 1주차 - Datejs
    프로그래밍/스터디 2018. 6. 7. 00:02

    Datejs

    현재 본인이 해당사항이 없는 date가 아니라 다른 date였다.

    Datejs는 자바스크립트 기존의 Date()의 기능을 확장시키기 위해서 개발된 라이브러리이다.

    Geoffrey McGill이 2007년 만든 Datejs는 2008년 개발이 중단되어서 이를 잇고자 DateJS: Evolved가 Gregory Wild-Smith에 의해 만들어져 있다.

    https://github.com/abritinthebay/datejs

    DateJS: Evolved를 기준으로 설명하도록 하겠다. 깃허브 저장소는 위 링크와 같다.

    Hello to JS

    먼저 첫 자바스크립트 스터디를 맞이하는 의미에서 JavaScript로 Hello World를 출력해 봐야겠다.

    console.log('Hello World');
    

    하고

    C:\Users\JunhoYeo\Desktop\date.js>node hello.js
    Hello World  
    

    처음에는 jsc.exe 같은 거를 써야 하는 줄 알고 노가다를 하다가 본인 컴퓨터에 node.js가 있다는 것과 이를 통해 실행이 가능하다는 것이 기억났다.

    Datejs 다운로드

    npm install datejs
    

    npm install로 Datejs를 설치했다.

    오늘 날짜 출력

    require('datejs');
    var date = Date.today()
    console.log(date);
    

    Date.today()는 현재 시간을 출력한다. 시간은 하루의 시작(00:00)으로 나온다.

    2018-06-04T15:00:00.000Z
    

    실행 결과는 위와 같다.

    2018년 06월 04일, T(for Tuesday), 00시 00분 00초를 가리키는 것 같은데 15랑 Z는 무슨 뜻인지 모르겠다.

    분명 본인 컴퓨터에는 5일로 되어 있는데 왜 4일으로 나왔을까 하니 아마 Timezone 설정이 KST로 안 되어 있어서인 것 같다.

    Timezone 설정

    Timezone을 설정하려면 어떻게 해야 할까?

    https://github.com/abritinthebay/datejs#in-nodejs-1

    위 문서에서처럼 Node.js에서는 간단히 Date.i18n.setLanguage([country IETF code])를 호출하면 된다.

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    var date = Date.today();
    console.log(date);
    console.log(String(date));
    console.log(typeof date);
    
    C:\Users\JunhoYeo\Desktop\date.js>node test.js
    2018-06-04T15:00:00.000Z
    Tue Jun 05 2018 00:00:00 GMT+0900 (대한민국 표준시)
    object
    

    위 실행 결과에서처럼 date의 type을 확인해보면 object인데 그것 때문에 String으로 형변환해야 제대로 표시되는 것 같다(이거 때문에 오랫동안 삽질했다).

    날짜 계산

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    // 아래 모든 실행결과는 2018.06.05 기준
    console.log(String(Date.today()));
    // 실행결과 : Tue Jun 05 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(String(Date.today().next().day()));
    // 다음 날을 구한다
    // day() 대신 다른 date parts 사용 가능
    // 실행결과 : Wed Jun 06 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(String(Date.today().next().addDays(1)));
    // 1일 더하기
    // day() 대신 다른 date parts(add + 복수형) 사용 가능
    // 실행결과 : Wed Jun 06 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(String((1).day().fromNow()));
    // 현재로부터 1일 후
    // 실행결과 : Wed Jun 06 2018 23:30:14 GMT+0900 (대한민국 표준시)
    

    원래는 위와 같이 모든 예제 코드에서 String()을 사용했었는데, 스터디 발표에서 String().toString()은 같은 기능을 하고, .toString()이 더 직관적이라는 것을 알게 되어서 수정했다.

    JavaScript에서는 chaining이 많이 이루어지기 때문에(실제로 여기에도 chaining이 많이 이루어진다) .toString()을 이용하면 가독성 면에서도 유리하다고 한다.

    조건 확인

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    // 아래 모든 실행결과는 2018.06.05 기준
    console.log(Date.today().is().sunday().toString());
    // 일요일인지 확인(true / false)
    // 실행결과 : false
    console.log(Date.today().is().weekday().toString());
    // 평일인지 확인(true / false)
    // 실행결과 : true
    

    스터디에서 아래 사실들을 배웠다.

    • method들이 묶여있는 object를 반환할 것이다.

    • 반환값이 boolean이기 때문에 굳이 .toString()을 사용하지 않아도 알아서 바꿔준다.

    • console.log()는 아래와 같이 인수로 받은 값을 무조건 String()을 통해 변환하지 않기 때문에 깐깐하게 사용해도 된다.

      > console.log({a:1});
      {a: 1}
      > console.log(String({a:1}));
      [object Object]
      

      Object.prototype.toStringStringTag라는 값을 통해 문자열로 표기되는데, console.log()는 이 값을 출력할 때 모호하게 사용하기 때문이다.

    • 개인차가 있는 부분이다.

    날짜 구하기

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    // 아래 모든 실행결과는 2018.06.05 기준
    console.log(Date.mon().toString());
    // 이번 주 월요일
    // 실행 결과 : Mon Jun 04 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(Date.jan().toString());
    // 이번 년도 1월 1일
    // 실행 결과 : Mon Jan 01 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(Date.today().first().mon().toString());
    // 이번 달의 첫 번째 월요일
    // 실행 결과 : Mon Jun 04 2018 00:00:00 GMT+0900 (대한민국 표준시)
    console.log(Date.jan().first().mon().toString());
    // 이번 년도 1월의 첫 번째 월요일
    // 실행 결과 : Mon Jan 01 2018 00:00:00 GMT+0900 (대한민국 표준시)
    

    위에서 알 수 있듯이 monday()mon(), january()jan()처럼 요일과 달을 줄여서 사용할 수도 있다.

    • 단축형 지원은 좋다.

    날짜 정하기

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    // 아래 모든 실행결과는 2018.06.05 기준
    console.log(Date.today().at('23:40').toString());
    // 정해진 시간의 오늘 날짜
    // 실행결과 : Tue Jun 05 2018 23:40:00 GMT+0900 (대한민국 표준시)
    console.log(Date.today().at({hour: 23, minute: 40}).toString());
    // 시간 설정하기
    // 실행결과 : Tue Jun 05 2018 23:40:00 GMT+0900 (대한민국 표준시)
    var junobirth = {month: 7, day: 4, hour: 0, minute: 0};
    console.log(Date.today().set(junobirth).toString());
    // 준호 생일로 날짜와 시간 설정하기
    // 주노 선물 사주실 거죠?
    // 실행결과 : Sat Aug 04 2018 00:00:00 GMT+0900 (대한민국 표준시)
    
    • 7월 4일을 메모하자.

    at()은 시간만 정하고, set()은 시간과 날짜를 모두 정할 수 있다.

    스터디에서 set으로도 at의 기능을 모두 쓸 수 있는데 이들이 공존하는 이유에 대해서 토론했다.

    • Evolved에서 set()이 생겼지만 기존의 at()을 없애면 호환성이 떨어지기 때문이 아닐까?

    • 두 기능 모두 기존의 Datejs에서부터 있었다.

    • at() 내부에서도 set()을 사용한다.

    • at('23:40')과 같이 formet을 받아 사용할 수 있게 한 것을 보아 simple interface를 제공하기 위한 의도인 것 같다.

    • 설정한다고 객체로 만드는 귀찮음을 감수할 필요가 없기 때문이다.

    • 단축형도 그렇고 Datejs의 개발자들은 짧고 편한 것을 좋아하는 것 같다.

    날짜 파싱

    // Convert text into Date
    Date.parse('today');
    Date.parse('t + 5 d'); // today + 5 days
    Date.parse('next thursday');
    Date.parse('February 20th 1973');
    Date.parse('Thu, 1 July 2004 22:30:00');
    

    http://www.datejs.com/

    원래 Datejs의 홈페이지 메인에 나오는 예시이다.

    Date.parse()는 파싱에 실패하면 null을 반환한다.

    원래 기존 JS의 Date()NaN을 반환하기 때문에 관련 이슈가 꽤 있다. 아직 패치되지 않은 것 같다.

    • 버전 1.0에 assign되어 고쳐졌다.

    • JavaScript에서는 new.target이 undefined가 아니면 현재 날짜, 아니라면 Invalid Date를 반환한다.

    조사과정에서 문제가 있어서 잘못된 정보를 알려드릴 뻔한 것 같아서 스터디 멤버들에게 죄송했다.

    윤년인지 확인

    Date.isLeapYear(year)는 년도를 입력받아 윤년 여부를 반환한다(윤년이면 true, 아니면 false).

    • 저거 좋다. 멋지다.

    이름으로 요일/달의 인덱스 가져오기

    Date.getDayNumberFromName('mon'); // 1
    Date.getMonthNumberFromName('jan'); // 0
    

    요일이나 달의 이름에서 인덱스를 파싱할 수도 있다.

    요일의 인덱스는 0~6(일요일부터 토요일), 달의 인덱스는 1월부터 0~11이다.

    require('datejs');
    Date.i18n.setLanguage('ko-KR');
    console.log(Date.getDayNumberFromName('mon'));
    console.log(Date.getMonthNumberFromName('jan'));
    

    그런데 이상하게 위 예제 코드를 짜고 실행하니 둘 다 -1으로 나왔다.

    • parser 제작 등에 유용하게 사용될 수 있는 기능 같다.

    • 축약형 때문일까?

    • setLanguage() 부분을 지우고 아래와 같이 실행하니 문제가 없었다.

      require('datejs');
      console.log(Date.getDayNumberFromName('mon'));
      console.log(Date.getMonthNumberFromName('jan'));
      
    • ko-KR.js 파일의 내용을 보고 mon 대신 로, jan 대신 1월로 입력해보니 문제가 없었다.

      require('datejs');
      Date.i18n.setLanguage('ko-KR');
      console.log(Date.getDayNumberFromName('월'));
      console.log(Date.getMonthNumberFromName('1월'));
      
    • setLanguage()가 기존의 설정을 덮어씌워서 문제가 발생했던 것으로 보인다.


    '프로그래밍 > 스터디' 카테고리의 다른 글

    Linux 소개  (0) 2018.02.08

    댓글

Designed by Tistory