今までは Moment.js 使ってたけどモダンに再設計された Luxon を使うことにした。
🤔 なぜ Luxon がつくられたか
Why does Luxon exist? に書いてある。
- 作者は Moment.js のメンテナー
- Moment.js を改善するアイデアを持っていたが良いコードベースではなかった
- より明示的な API にしたかった
moment(Number)
->DateTime.fromMillis(Number)
moment(Date)
->DateTime.fromJSDate(Date)
- 追加のデータファイルなしでタイムゾーンを扱いたかった
- Intl API を使って国際化の仕組みを再考したかった
⏰ Moment.js に劣っていること
- 最新ブラウザの機能を使うと古いブラウザのための互換性対応をしなければならずコードが煩雑になる
- 国際化された文字列をコードベースに保持してない故にブラウザが対応するまでその機能を待たなければいけない可能性
- Intl API のいくつかはブラウザ依存のため Luxon の動作もそれに依存する
特に Intl API は古いブラウザでは動作しないので、そこに対応する必要性の有無が Moment.js を使うか Luxon を使うかの分かれ道となっている。
Node.js で使うなら問題にならなそうだ。
🛠 インストール
$ yarn add luxon @types/luxon
🗞 TypeScript
import {DateTime} from 'luxon'; // now (string) DateTime.local().toString(); // => 2018-09-20T14:13:12.954+09:00 DateTime.utc().toString(); // => 2018-09-20T05:13:12.961Z // now (unixtime) DateTime.local().toMillis(); // => 1537420392961 Date.now(); // => 1537420392961 // format const dt = DateTime.fromISO('2020-07-24T20:00:00'); dt.toUTC().toString(); // => 2020-07-24T11:00:00.000Z dt.toString(); // => 2020-07-24T20:00:00.000+09:00 dt.toISO(); // => 2020-07-24T20:00:00.000+09:00 dt.toHTTP(); // => Fri, 24 Jul 2020 11:00:00 GMT dt.toFormat('yyyy-MM-dd HH:mm:ss z'); // => 2020-07-24 20:00:00 Asia/Tokyo dt.toSQL(); // => 2020-07-24 20:00:00.000 +09:00 dt.toSQLDate(); // => 2020-07-24 dt.toSQLTime(); // => 20:00:00.000 +09:00