본문 바로가기

Backend/Javascript

[Javascript] - Date

Date (날짜)

 

- 자바스크립트의 Date

 

자바스크립트는 자바의 Date 클래스를 거의 그대로 가져다 써서 Date 객체를 만들었습니다.

때문에 클래스 프로그래밍의 최악의 디자인 패턴을 그대로 보여줍니다.

자바스크립트의 Date 객체는 상당히 많은 메서드들을 제공합니다. (대부분은 getter / setter 입니다)

 

getDate
getDay
getFullYear
getHours
getMilliseconds
...

 

 

일부 메서드들을 살펴보면, getMonth 메서드는 월의 시작 값을 0 으로 만들어 0 ~ 11 사이의 값을 반환하지만, getDate 는 1 ~ 31 사이의 값을 반환합니다. 이런 일관성 없는 구현은 에러를 발생시킬 확률을 높입니다.

 

getYear 와 setYear 메서드는 1999년 이후로는 제대로 동작하지 않아 사용하지 않습니다.

대신 getFullYear 와 setFullYear 를 사용해야 합니다.

 

const d1 = new Date();
console.info(d1.getYear()); // 121

const d2 = new Date();
console.info(d2.getFullYear()); // 2021

 

 

- Date 객체는 클래스 프로그래밍에서 아주 좋지 않은 선례를 보여줍니다.

 

객체는 무언가를 캡슐화해야하고, 상호 작용은 트랜잭션 형태여야 하며, 좀 더 고차원적인 행동이어야 하지만 Date 는 단순 시간과 관련된 각각의 요소들에 대한 getter setter 만 제공합니다.

 

- epoch

 

여기서 epoch 란 시스템에서 날짜와 시간의 흐름을 나타낼 때 기준을 삼는 시간 입니다.

자바스크립트가 사용하는 epoch 는 유닉스 epoch 로 1970-01-01 입니다.

Date 생성시에 timestamp 를 사용 할 수 있는데, 간단하게 아래와 같은 부분을 볼 수 있습니다.

 

const d1 = new Date();
console.info(d1); // ex) 2021-01-01T00:00:00
console.info(d1.getTime()); // ex) 1609459200000

const d2 = new Date(d1.getTime());
console.info(d2); // ex) 2021-01-01T00:00:00

const d3 = new Date(0);
console.info(d3); // 1970-01-01T00:00:00

 

- Moment, Dayjs, ... 그 이후

 

실무에선 Date 객체를 사용하기보단 Moment.js (현재는 deprecated) , Day.js 등의 라이브러리를 많이 사용합니다.

기존 Date 객체가 갖고있는 함수들의 헷갈리는 메서드명이라던지, mutable 문제로 인해 전 Day.js 를 주로 사용하는 편입니다.

하지만 추후 자바스크립트가 쓸데없이 많은 메서들을 쳐내고, 간단한 변환 함수와 0000-01-01 로 수정된 epoch 를 갖는 새로운 Date 객체를 만들어내면 좋을 것 같습니다.

 

출처 : 자바스크립트는 왜 그 모양일까?

'Backend > Javascript' 카테고리의 다른 글

[Javascript] - Testing  (0) 2021.01.30
[Javascript] - JSON  (0) 2021.01.23
[Javascript] - Asynchronous Programming  (0) 2021.01.09
[Javascript] - Purity  (0) 2021.01.02
[Javascript] - this  (0) 2020.12.19