尋常でないもふもふ

a software engineer blog

JavaScriptの日付処理でLuxonを使う

今までは 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