날짜 연산
날짜는 숫자이므로 날짜에서 날짜를 빼면 몇 밀리초가 지났는지 알 수 있습니다.
const d1 = new Date(1985, 10, 2);
const d2 = new Date(2019, 8, 10);
const msDiff = d2 - d1; // 1068336000000 ms
const daysDiff = msDiff/1000/60/60/24; // 12365 days
Arrays.prototype.sort를 써서 날짜를 정렬할 수도 있습니다.
const dates = [];
// 랜덤한 날짜를 몇 개 만듭니다.
const min = new Date(2019, 0, 1).valueOf();
const delta = new Date(2020, 0, 1).valueOf() - min;
for(let i=0; i<10; i++) {
dates.push(new Date(min + delta * Math.random()));
}
/*
갓 만들어진 dates : [
2019-07-02T14:04:00.502Z,
2019-01-25T04:30:20.037Z,
2019-11-25T08:51:31.155Z,
2019-12-05T16:06:54.204Z,
2019-01-18T10:32:39.646Z,
2019-05-07T08:58:42.600Z,
2019-06-18T21:14:32.534Z,
2019-04-18T17:44:08.563Z,
2019-01-29T14:26:21.280Z,
2019-04-25T05:11:43.066Z
]
*/
// dates 배열은 랜덤으로 만들었으므로 (아마) 뒤죽박죽일 겁니다.
// 다음과 같이 역순으로 정렬할 수 있습니다.
dates.sort((a, b) => b - a);
/*
역순으로 정렬한 dates : [
2019-12-05T16:06:54.204Z,
2019-11-25T08:51:31.155Z,
2019-07-02T14:04:00.502Z,
2019-06-18T21:14:32.534Z,
2019-05-07T08:58:42.600Z,
2019-04-25T05:11:43.066Z,
2019-04-18T17:44:08.563Z,
2019-01-29T14:26:21.280Z,
2019-01-25T04:30:20.037Z,
2019-01-18T10:32:39.646Z
]
*/
// 날짜순으로 정렬할 수도 있습니다.
dates.sort((a, b) => a - b);
/*
날짜순으로 정렬한 dates : [
2019-01-18T10:32:39.646Z,
2019-01-25T04:30:20.037Z,
2019-01-29T14:26:21.280Z,
2019-04-18T17:44:08.563Z,
2019-04-25T05:11:43.066Z,
2019-05-07T08:58:42.600Z,
2019-06-18T21:14:32.534Z,
2019-07-02T14:04:00.502Z,
2019-11-25T08:51:31.155Z,
2019-12-05T16:06:54.204Z
]
*/
Moment.js 에는 날짜를 빼거나 더하는 데 유용한 메서드도 많이 들어있습니다.
const moment = require('moment');
let m = moment(); // 현재
m.add(3, 'days'); // m은 이제 3일 뒤입니다.
m.subtract(2, 'years'); // m은 이제 2년 전으로부터 3일이 지난 날짜입니다.
m = moment(); // 리셋
m.startOf('year'); // m은 이제 올해의 1월 1일입니다.
m.endOf('month'); // m은 이제 올해의 1월 31일입니다.
Moment.js는 메서드를 체인으로 연결할 수도 있습니다.
const moment = require('moment');
let m = moment()
.add(10, 'hours')
.subtract(3, 'days')
.endOf('month');
// m은 이제 3일전으로부터 10시간 뒤인 달의 마지막 순간입니다.
// 3일전으로 부터 10시간 뒤가 달이 바뀐다면 그 달의 마지막 순간(막일의 23:59:59)일 테고, 달이 바뀌지 않는다면 이번 달의 마지막 순간(23:59:59)일 겁니다.