結論
2023年現在のファーストチョイスとしては「date-fns」が選択肢に上がりそうです。
ただ、今後はTemporalがECMA標準になった場合はこちらを使っていくことが予測されそうです。
Dateオブジェクト
Java1.0のDateを参考にして作られた。本家のJavaでは1.1でほとんど非推奨になったがJavaScriptではいまだにJavaで非推奨のメソッドが使われている。
特徴
- 0indexが使われる。(+1が必要)
- タイムゾーンがない。
フォーマット
月は1月を0として扱うので+1する必要もある。
1 2 3 4 5 |
const d = new Date(); console.log( 'date-format', `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}` ); |
moment
特徴
- 数年前まではDateオブジェクトが使いづらいのでこれを使うのが一般的でした。
- 翻訳ファイルを含むのでビルドサイズが大きすぎることがFE界隈では有名な話
- 2023年現在は新規開発は停止していてメンテナンスモードに入ったので別ライブラリを使うことが推奨されている。
通常のDateオブジェクトに比べてできること
addなどの日付計算
日付のフォーマットが便利
Dateに比べてフォーマットが楽
1 2 |
const moment = require('moment'); console.log('moment-format', moment().format('YYYY-MM-DD')); |
day.js
特徴
- momentと同じAPIを使用しているのに、momentに比べてビルドサイズが小さいのでmomentからday.jsに移行する現場が増えている。
- momentを使い慣れているのであればこれを使うべき。
- オブジェクト指向で実装されています。
- ほぼJavaScriptで実装されています。(TypeScriptが使われていない)
デメリット
- 四則演算処理を書いた場合のビルドサイズが大きい。(なので、今後TemporalがECMA標準になった場合はTemporalに移行した方が良いらしい)
js-Joda
Javaを使い慣れていると利点があるライブラリなので、基本的にはこれは選択肢には入らないのかなと思われます。
特徴
- Java系ライブラリ(java.time、Joda-Time、またはNoda Time)を使い慣れている人はこれを使うべき。
Luxon
特徴
- 独自のDateTimeオブジェクトを取り回す形になっており、その恩恵でタイムゾーンの操作がかなり直感的
- 使い勝手はイマイチかなと思います。
date-fns
特徴
- day.jsとよく比較されます。
- momentに慣れていないのであればこれも選択肢に上がります。
- 関数型で実装されています。
- ほぼTypeScriptで実装されています。
Temporal
ECMAScriptを策定しているTC39が新しく仕様を提案している。momentやdate-fnsに比べて比較的新しめのJavaScript日付ライブラリになります。他のライブラリと異なりJavaScriptのAPIそのもの(Dateオブジェクト)を見直すべきだという発想の元で開発されています。
公式ドキュメント
https://tc39.es/proposal-temporal/docs/ja/index.html
特徴
- 正確
- タイムゾーンや別のカレンダーも扱える。
- 使いやすい
- 将来的にECMA標準になる予定
- イミュータブルなので後から時刻の変更ができない。
デメリット
- まだ、ECMA標準ではないのでもし使うとしてもpolyfillが必要になる。
フォーマット
あまり強くないらしいので、引き続き他のライブラリ(moment、day.jsなど)を使用するのが選択肢に入るらしい。
この記事へのコメントはありません。