yamaday0u Blog Written by yamaday0u

【Node.js】Day.jsの使い方・日付操作〜Moment.jsとの比較

Node.js

こんにちは、やまだゆうです。

最近、業務でサーバーサイドで使っていたライブラリ「Moment.js」を「Day.js」に切り替える経験をしました。良い勉強になったのでDay.jsについて紹介したいと思います。

  1. きっかけ
  2. Day.jsとは
  3. Day.jsを使った時間操作の例

スポンサーリンク

きっかけ

サーバーのNode.jsバージョンの更新の際にライブラリも見直すことになり、使用していたMoment.jsが2020年にメンテナンスモードになっていたことに気がついたのがきっかけです。

Moment.jsの公式ページでは以下のライブラリが代替として推奨されています。

  • Luxion
  • Day.js
  • date-fns
  • js-Joda

このうちDay.jsを採用しました。

Day.jsとは

軽量・シンプル・イミュータブル・国際化対応を謳った時間操作ライブラリです。とにかく使いやすく、公式サイトも充実しています。

Day.js · 2kB JavaScript date utility library

採用理由

上記で紹介したとおり代替のライブラリは4つ推奨されていました。その中でdayjsを採用した理由は次のとおりです。

  • ほかのプロジェクトもあり切り替えに使える時間があまりない
  • Day.jsはMoment.jsと同じAPI(関数)が使える

この2つの理由がたいへんマッチしていたのでDay.jsの採用を決めました。

Moment.jsとの違い

Day.jsはMoment.jsと同じAPIが使えるので、使用感はほとんど同じです。ですが1つ大きな違いがあります。

Moment.jsはミュータブル、Day.jsはイミュータブル

日付操作をすると元の値も変わるかどうかということです。以下のMoment.jsを使用したサンプルを見てください。

const today = moment();
console.log(today.format("YYYY-MM-DD")); // 2023-11-14

const tomorrow = today.add(1, "day");
console.log(tomorrow.format("YYYY-MM-DD")); // 2023-11-15
console.log(today.format("YYYY-MM-DD")); // 2023-11-15

このようにtoday自体の値が変わってしまいます。ミュータブル(可変)ということです。一方でDay.jsはイミュータブル(不変)なので日付操作をしても元の値は変わりません。

const today = dayjs();
console.log(today.format("YYYY-MM-DD")); // 2023-11-14

const tomorrow = today.add(1, "day");
console.log(tomorrow.format("YYYY-MM-DD")); // 2023-11-15
console.log(today.format("YYYY-MM-DD")); // 2023-11-14

感覚的にはイミュータブルのほうが自然な使い心地ですよね。

スポンサーリンク

Day.jsを使った時間操作の例

ここからは実際にDay.jsを使っていろんな時間操作をしてみます。まずはプロジェクトを作成します。

mkdir dayjs-practice
cd dayjs-practice
touch index.js

Day.jsをインストールします。

npm install dayjs

準備が整いました。使い方を見ていきましょう。
ここで使用しているプログラムはぼくのGithubで公開しています。お手軽に試したい方はそちらをクローンしてください。

  1. 現在時刻を取得する
  2. 任意の日付けでDay.jsオブジェクトを作る
  3. 時間を操作する
  4. 月末・月初を取得する
  5. プラグインを使ってタイムゾーンを操作する

現在時刻を取得する

最初は基本的な現在時刻の取得です。Moment.jsと同じようにformat()が使用できます。

import dayjs from "dayjs";

const today = dayjs().format("YYYY-MM-DD");
console.log(today); // 2023-11-13

任意の日付けでDay.jsオブジェクトを作る

const specificDay = dayjs("2023-05-30").format("YYYY-MM-DD");
console.log(specificDay); // 2023-05-30

時間を操作する

先ほどのMoment.jsとの違いでも示したとおり、時間を足したり引いたりすることもできます。

const yesterday = dayjs().subtract(1, "day").format("YYYY-MM-DD");
console.log(yesterday); // 2023-11-12

const tomorrow = dayjs().add(1, "day").format("YYYY-MM-DD");
console.log(tomorrow); // 2023-11-14

上記では日単位で加減しましたが、もちろん分や秒の単位でもできます。詳しくは「Add · Day.js」を参照してください。

月末・月初を取得する

ある処理が実行された日が属する月の最初や最後の日を取得したい場面があると思います。こういうときはendOf()startOf()が便利です。

const endOfMonth = dayjs().endOf("month").format("YYYY-MM-DD");
console.log(endOfMonth); // 2023-11-30

const startOfMonth = dayjs().startOf("month").format("YYYY-MM-DD");
console.log(startOfMonth); // 2023-11-01

プラグインを使ってタイムゾーンを操作する

Day.jsではプラグインを使ってタイムゾーンを指定した時間操作ができます。ぼくも業務でこの機能を実装しました。

import dayjs from "dayjs";
import utc from "dayjs/plugin/utc.js";
import timezone from "dayjs/plugin/timezone.js";
dayjs.extend(utc);
dayjs.extend(timezone);

const todayTokyo = dayjs().tz("Asia/Tokyo").format("YYYY-MM-DD HH:mm:ss");
console.log(`Tokyo: ${todayTokyo}`); // Tokyo: 2023-11-13 23:10:22

const todayNewYork = dayjs().tz("America/New_York").format("YYYY-MM-DD HH:mm:ss");
console.log(`NewYork: ${todayNewYork}`); // NewYork: 2023-11-13 09:10:22

参考資料

yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村