UI/UXことはじめ その1

これまでJavaScriptでの日付と時間の操作は標準機能ではかなり煩雑になるため基本的にライブラリを使用することが推奨されてきました。
他にもライブラリはたくさんあるのですが、2020年頃まではMoment.jsが定番となっており。
直感的にさわれる非常に便利なライブラリでした。(※私も大変お世話になりました。)
しかし、Moment.jsは、2020年に新規機能の開発停止、メンテナンスモード(セキュリティ修正とMoment Timezoneのデータ更新は行う)に移行することが発表され、これから新規開発するプロジェクトでは、別のライブラリを使うことが推奨されています。
公式でも移行するライブラリとして下記が挙げられています。
Luxonは、JavaScriptで日付と時刻を処理するためのライブラリです。
Momentなど他の日付操作ライブラリを使ったことのある方にはわかりやすいと思いますが、主に下記のような特徴があります。
インストール方法は下記です。
npm install --save luxon
yarn add luxon
import { DateTime } from "luxon";
<script src="/path/to/luxon.js"></script>
<script>
var DateTime = luxon.DateTime;
</script>
DateTime.now() // [ DateTime 2025-02-14T16:25:06.885+09:00 ]
DateTime.fromISO("2025-02-14")
DateTime.fromFormat("2025/02/14","yyyy/MM/dd")
取得形式は様々ありますが、Momentと記法が若干違うので注意が必要です。
DateTime.now().toJSDate() // [ Date Fri Feb 14 2025 16:25:06 GMT+0900 (日本標準時) ]
DateTime.now().toISO() // "2025-02-14T07:25:06.896Z"
DateTime.now().toISODate() // "2025-02-14"
DateTime.now().toFormat('yyyy-MM-dd HH:mm:ss') // "2025-02-14 07:25:06"
DateTime.now().toObject()
// {"year":2025,"month":2,"day":14,"hour":16,"minute":25,"second":6,"millisecond":897}
他にもこちらにサンプルがあるのでどのような取得方法があるのかをご確認ください。
const dt = DateTime.now()
dt.plus({ hours: 2, minutes: 1 })
const dt = DateTime.now()
dt.minus({ days: 1 })
const dt = DateTime.now()
dt.startOf("day")
const dt = DateTime.now()
dt.endOf("year")
Moment のオブジェクトは可変ですが、Luxon のオブジェクトは不変です。たとえば、Moment では次のようになります。
const m1 = moment();
const m2 = m1.add(1, 'hours');
m1.valueOf() === m2.valueOf(); //=> true
m1とm2はどちらの値にも 1 時間追加されます。これは、実際にはm1もm2も同じオブジェクトであるため発生します。しかし、Luxonの場合は下記のようになります。
const d1 = DateTime.now();
const d2 = d1.plus({ hours: 1 });
d1.valueOf() === d2.valueOf(); //=> false
これは、plusメソッドがd1の値を変更せずに新しいインスタンスを返すために発生します。また、これは、Luxon がコピー コンストラクターやクローン メソッドを必要としないことも意味しています。
その他の違いについては、Momentからの移行方法について説明されたページを御覧ください。
Momentに慣れ親しんだ方にとっては少し記法が変わっている部分があるため慣れない部分もあると思いますが、使っていくうちに便利な部分も発見でき、とても良いライブラリだなと思いました。
良ければ参考にしてみてください。