Node.js luxon 모듈 사용 해보기
2020-10-05 22:18:32

이전에 페이스북 그룹에서 Moment 프로젝트가 더 이상 유지 보수를 하지 않는다는 글을 봤었다.

실제 프로젝트 상태에 적혀 있었고 신규 프로젝트에서 대체할 모듈을 제시를 하는데 나는 그 중에

맨 처음에 적혀있는 luxon을 사용해보기로 했다.

설치

1
npm i luxon -S

mt와 비교

가장 큰 차이점은 Moment의 경우 처음 객체를 생성 하고 이후에 추가적인 연산 등의 행위를

하였을 때 원본 객체도 바뀌기 때문에 별도로 clone을 해서 사용을 해야 되는데 인지를 못 해서

실수를 했던 경험이 있는데 luxon의 경우 생성 객체가 불변이기 때문에 별도 작업이 필요가 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const { DateTime } = require("luxon");

const MomentTimezone = require("moment-timezone");

const date = {
mt: MomentTimezone().tz("America/New_York"),
luxon: DateTime.fromObject({ zone: "America/New_York" }),
};

const mt1 = date.mt.format("YYYY-MM-DD");

const mt2 = date.mt.add(1, "days").format("YYYY-MM-DD");

console.log(
`mt: ${mt1}`,
`mt2: ${mt2}`,
`원본: ${date.mt.format("YYYY-MM-DD")}`
); // mt: 2020-10-05 mt2: 2020-10-06 원본: 2020-10-06

const luxon1 = date.luxon.toFormat("yyyy-LL-dd");

const luxon2 = date.luxon.plus({ days: 1 }).toFormat("yyyy-LL-dd");

console.log(
`luxon1: ${luxon1}`,
`luxon2: ${luxon2}`,
`원본: ${date.luxon.toFormat("yyyy-LL-dd")}`
); // luxon1: 2020-10-05 luxon2: 2020-10-06 원본: 2020-10-05

기존에 써 봤던 mt 대체 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

const { DateTime } = require("luxon"); // luxon load

const MomentTimezone = require("moment-timezone"); // moment-timezone load

const date = {
mt: MomentTimezone().tz("America/New_York"),
luxon: DateTime.fromObject({ zone: "America/New_York" }),
};

console.log(`mt를 통한 뉴욕 시간: ${date.mt.format("YYYY-MM-DD HH:mm")}`);

// mt를 통한 뉴욕 시간: 2020-10-05 10:10

console.log(
`luxon을 통한 뉴욕 시간: ${date.luxon.toFormat("yyyy-LL-dd HH:mm")}`
);

// luxon을 통한 뉴욕 시간: 2020-10-05 10:10

console.log(`mt로 보는 주차(년 기준): ${date.mt.week()}`); // 41

console.log(`luxon으로 보는 주차(년 기준): ${date.luxon.weekNumber}`); // 41

const weekOfMonth = {
mt:
MomentTimezone().tz("America/New_York").week() -
MomentTimezone().tz("America/New_York").startOf("month").week() +
1,
luxon: date.luxon.weekNumber - date.luxon.startOf("month").weekNumber + 1,
};

console.log(`mt로 보는 주차(월 기준): ${weekOfMonth.mt}`); // 2

console.log(`luxon으로 보는 주차(월 기준): ${weekOfMonth.luxon}`); // 2

const diff = {
mt: MomentTimezone.tz("Asia/Seoul").diff(
MomentTimezone("2020-10-05 00:00:00").tz("Asia/Seoul")
),
luxon: DateTime.fromObject({ zone: "Asia/Seoul" }).diff(
DateTime.fromObject({
zone: "Asia/Seoul",
year: 2020,
month: 10,
day: 5,
hour: 0,
minute: 0,
second: 0,
})
).toObject(),
};

console.log(`mt로 보는 현재 - 지정된 날 = ts: ${diff.mt}`); // 87448000

console.log(`luxon으로 보는 현재 - 지정된 날 = ts: ${diff.luxon.milliseconds}`); // 87448004

참고