-
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.toString
은StringTag
라는 값을 통해 문자열로 표기되는데,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');
원래 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()
가 기존의 설정을 덮어씌워서 문제가 발생했던 것으로 보인다.