JSの日付ライブラリは、どれを使えばいいのかまとめ

2020/12/28に公開

Moment.jsは、新規開発停止、メンテナンスモードに移行

https://momentjs.com/docs/

Moment.jsは、新規機能の開発停止、メンテナンスモード(セキュリティ修正とMoment Timezoneのデータ更新は行う)に移行することが発表されています。これから新規開発するプロジェクトでは、別のライブラリを使うことが推奨されています。

僕の新規開発のプロジェクトでも当初はMoment.jsを使っていましたが、リリース前にこの発表が出たので、別のライブラリに変更することにしました。

Moment.jsのドキュメントページに、推奨ライブラリが4つ掲載されていたので、その中から選ぶことにしました。

  1. Luxon
  2. Day.js
  3. date-fns
  4. js-Joda

簡単に結論が出るケース

Day.jsを使うべき人

  • Moment.jsからの移行
  • Moment.jsを使い慣れている人
    • Day.jsはMoment.jsと同じAPI体系を持つから

js-Jodaを使うべき人

  • java.time、Joda-Time、またはNoda Timeを使い慣れている人

これに当てはまらない場合は、3つのライブラリから比較する必要があります。js-Jodaについては、Javaに慣れてる人しか使わないだろうということで外しています。

Luxonは、どうしてもこれがいいという理由があれば使う

Luxonに関しては、使い勝手、人気がイマイチな感じだったので、あまり調査していません。Luxonを調べてみて、すごく気に入るところがあった人はLuxonを使うのが良いと思います。

2022/03/17 追記

Luxonの採用例があったので追記します。
https://zenn.dev/stafes/articles/sayonara-moment

Luxonは独自のDateTimeオブジェクトを取り回す形になっており、その恩恵でタイムゾーンの操作がかなり直感的になっています。

Day.js vs date-fns

結論から言うと、僕はdate-fnsを採用することにしました。採用理由は以下です。

人気は互角

https://www.npmtrends.com/dayjs-vs-date-fns-vs-luxon-vs-moment

2020年12月27日現在、github starsでは、Day.jsが32960、date-fnsが24527
とDay.jsの方が上回っています。

パッケージダウンロード数では、date-fnsの方が多いです。これは、date-fnsの方が作成された日付が古いからというのが理由としてありそうです。

人気に関しては、勢いのあるDay.jsと、老舗のdate-fnsといった感じで、どちらも人気があると言えそうです。

開発継続性は、date-fnsがやや優勢か

ライブラリの開発が停止すると困るので、なるべく長くメンテナンスされそうなプロジェクトを採用する方が望ましいです。

Day.js

https://github.com/iamkun/dayjs/graphs/contributors
メイン開発者は1人、コントリビューターは220人
スポンサーは中国企業が付いている

date-fns

https://github.com/date-fns/date-fns/graphs/contributors
メイン開発者は2人、コントリビューターは285人

https://date-fns.org/docs/

スポンサー企業が、1Passwordを初め、たくさんいる

現状では、date-fnsの方がやや優勢と言えそうです。Day.jsの方が2018年に開始したプロジェクトであることを勘案すると、今後は状況が変わってくる可能性はあると思います。

使い勝手は、好みの問題

オブジェクト指向のDay.jsと、関数型のdate-fnsという違いがあり、日付を扱うにはシンプルな関数型のdate-fnsの方が良いと思ったので、僕はdate-fnsを採用することにしました。オブジェクト指向で書きたい人は、Day.jsを採用するといいと思います。

詳細は、以下の記事を参考にしてください。

JavaScript dayjsはMoment.jsの代替になるか?
JS の日時操作ライブラリを比較する: date-fns のインターフェイスがイカす
面倒なJavaScriptの日付の処理は「date-fns」でラクに片付けよう
JavaScript: date-fnsでタイムゾーンを扱う
BASEの日付ライブラリについて

2021年時点でのシェア

https://2021.stateofjs.com/ja-JP/other-tools/#libraries

2022年時点でのシェア

https://2022.stateofjs.com/ja-JP/other-tools/#date_management

2023年時点でのシェア

https://2023.stateofjs.com/ja-JP/other-tools/#libraries

Temporalに期待

2024年7月現在、まだ実務では使えませんが、今後に期待できそうなプロジェクトがあったので紹介します。

https://tc39.es/proposal-temporal/docs/ja/

Date は ECMAScript において長年の悩みの種でした。これは Temporal のプロポーザル(草案)です。Temporal はグローバルオブジェクトであり、(Math のように)トップレベルの名前空間として機能します。Temporal はモダンな date/time API を ECMAScript にもたらします。

最後に

その他にも採用するプロジェクトによって必要になる細かい要件があると思うので、それを満たすライブラリを選択してください。この記事が、JSの日付ライブラリ選びのざっくりしとした指針になれば幸いです。

Discussion