Moment.jsで日付操作(比較, 差分, フォーマット)

JavaScriptの日付操作用ライブラリである「Moment.js」の利用方法を確認します。「Moment.js」は、Dateオブジェクトをラップして、日付操作に関する様々な機能を提供します。豊富な機能が提供されていますが、利用頻度の高い機能について取り上げます。

momentをインストール

momentをインストールします。

// yarnの場合
yarn add moment

// npmの場合
npm install moment --save

インストールできました。

$ yarn list --depth=0 | grep moment
├─ moment@2.24.0

オブジェクト生成

読み込み

インストールしたモジュールを読み込みます。

const moment = require('moment')

または、

import moment from 'moment'

生成

コンストラクタ引数を指定しない場合、現在日時のMomentオブジェクトが生成されます。日時を表す文字列Dateオブジェクト からも生成できます。

now = moment()
now.format()  // '2019-02-12T00:58:09+09:00'

day = moment('2019-01-10 07:30:20')
day.format()  // '2019-01-10T07:30:20+09:00'

day2 = moment(new Date())
day2.format()  // '2019-02-12T01:02:06+09:00'

日時の加算減算
( add subtract )

日時の加算には addメソッド を利用します。

// 年 → 「years or y」 
moment('2019-01-10 07:30:20').add(2, 'y').format()  // '2021-01-10T07:30:20+09:00'

// 月 → 「months or M」 
moment('2019-01-10 07:30:20').add(3, 'M').format()  // '2019-04-10T07:30:20+09:00'

// 週 → 「weeks or w」 
moment('2019-01-10 07:30:20').add(4, 'w').format()  // '2019-02-07T07:30:20+09:00'

// 日 → 「days or d」 
moment('2019-01-10 07:30:20').add(4, 'd').format()  // '2019-01-14T07:30:20+09:00'

// 時間 → 「hours or h」 
moment('2019-01-10 07:30:20').add(4, 'h').format()  // '2019-01-10T11:30:20+09:00'

// 分 → 「minutes or m」 
moment('2019-01-10 07:30:20').add(4, 'm').format()  // '2019-01-10T07:34:20+09:00'

// 秒 → 「seconds or s」 
moment('2019-01-10 07:30:20').add(4, 's').format()  // '2019-01-10T07:30:24+09:00'

日時の減算には subtractメソッド を利用します。

moment('2019-01-10 07:30:20').subtract(4, 'years').format()  // '2015-01-10T07:30:20+09:00'

始まり、終わり
( startOf endOf )

startOfメソッド endOfメソッド を利用すると、時間単位ごとの 始まり終わり を取得できます。

moment('2019-01-10 07:30:20').startOf('year').format()  // '2019-01-01T00:00:00+09:00'
moment('2019-01-10 07:30:20').endOf('year').format()    // '2019-12-31T23:59:59+09:00'

moment('2019-01-10 07:30:20').startOf('months').format()    // '2019-01-01T00:00:00+09:00'
moment('2019-01-10 07:30:20').endOf('months').format()      // '2019-01-31T23:59:59+09:00'

moment('2019-01-10 07:30:20').startOf('weeks').format() // '2019-01-06T00:00:00+09:00'
moment('2019-01-10 07:30:20').endOf('weeks').format()   // '2019-01-12T23:59:59+09:00'

moment('2019-01-10 07:30:20').startOf('days').format()  // '2019-01-10T00:00:00+09:00'
moment('2019-01-10 07:30:20').endOf('days').format()    // '2019-01-10T23:59:59+09:00'

moment('2019-01-10 07:30:20').startOf('hours').format() // '2019-01-10T07:00:00+09:00'
moment('2019-01-10 07:30:20').endOf('hours').format()   // '2019-01-10T07:59:59+09:00'

コピー
( clone )

日付の加算など行うと、最初に設定した日時が不明になります。

a = moment('2019-01-10 07:30:20')
a.format()  // '2019-01-10T07:30:20+09:00'
a.add(3, 'd')
a.format()  // '2019-01-13T07:30:20+09:00'

元の日時を保持しておきたい場合、cloneメソッド でコピーを作成します。

b = moment('2019-01-10 07:30:20')
b.format()  // '2019-01-10T07:30:20+09:00'
b_clone = b.clone()
b_clone.add(3, 'd')
b.format()          // '2019-01-10T07:30:20+09:00'
b_clone.format()    // '2019-01-13T07:30:20+09:00'

他の日時との差分
( diff )

dateTo = moment('2018-09-01 06:00:00')
dateFrom = moment('2018-12-01 12:00:00')

// ミリ秒を返します
dateFrom.diff(dateTo)  // 7884000000
dateFrom.diff(dateTo) / (24 * 60 * 60 * 1000)  // 91.25

// 第2引数で単位を指定できます。
dateFrom.diff(dateTo, 'months')   // 3
dateFrom.diff(dateTo, 'days')     // 91
dateFrom.diff(dateTo, 'hours')    // 2190

// 第3引数で小数の調整ができます。
dateFrom.diff(dateTo, 'days', true)  // 91.25
dateFrom.diff(dateTo, 'days', false) // 91

他の日時との比較
( isAfter isBefore isBetween )

a = moment('2018-09-01 06:00:00')
b = moment('2018-10-01 06:00:00')
c = moment('2018-11-01 06:00:00')

b.isAfter(a)  // true
b.isAfter(b)  // false
b.isAfter(c)  // false

b.isSame(a)  // false
b.isSame(b)  // true
b.isSame(c)  // false

b.isBefore(a)  // false
b.isBefore(b)  // false
b.isBefore(c)  // true

b.isSameOrAfter(a)  // true
b.isSameOrAfter(b)  // true
b.isSameOrAfter(c)  // false

b.isSameOrBefore(a)  // false
b.isSameOrBefore(b)  // true
b.isSameOrBefore(c)  // true

b.isBetween(a, c)  // true
c.isBetween(a, b)  // false

フォーマット
( format )

a = moment('2019-01-10 17:30:20')
a.format('YYYY-MM-DD HH:mm:ss')  // '2019-01-10 17:30:20'

// Unixタイムスタンプ
a.format('X')  // '1547109020'

// 月
a.format('M')       // '1'
a.format('MM')      // '01'
a.format('MMM')     // 'Jan'
a.format('MMMM')    // 'January'

// 曜日
a.format('d')       // '4'
a.format('dd')      // 'Th'
a.format('ddd')     // 'Thu'
a.format('dddd')    // 'Thursday'

詳しい指定方法は、https://momentjs.com/docs/#/displaying/format/ にて確認できます。

言語設定
( locale )

曜日などの表示を日本語表記するには localeメソッド を利用します。

moment.locale('ja')
a = moment('2019-01-10 17:30:20')

// 月
a.format('M')       // '1'
a.format('MM')      // '01'
a.format('MMM')     // '1月'
a.format('MMMM')    // '一月'

// 曜日
a.format('d')       // '4'
a.format('dd')      // '木'
a.format('ddd')     // '木'
a.format('dddd')    // '木曜日'

タイムゾーンの設定

moment-timezoneをインストール

タイムゾーンの設定を行うには、 moment-timezone というプラグインが別途必要です。インストールします。

// yarnの場合
yarn add moment-timezone

// npmの場合
npm install moment-timezone --save

インストールできました。

$ yarn list --depth=0 | grep moment-timezone
├─ moment-timezone@0.5.23

デフォルトのタイムゾーンを設定

デフォルトのタイムゾーンを設定するには、tz.setDefaultメソッド を利用します

const moment = require('moment')
require('moment-timezone')

moment.tz.setDefault('Asia/Tokyo')
moment('2019-01-10 07:30:20').format()  // '2019-01-10T07:30:20+09:00'

moment.tz.setDefault('America/Los_Angeles')
moment('2019-01-10 07:30:20').format()  // '2019-01-10T07:30:20-08:00'

moment.tz.setDefault('Europe/London')
moment('2019-01-10 07:30:20').format()  // '2019-01-10T07:30:20Z'

タイムゾーン変更

タイムゾーンを変更するには、tzメソッド を利用します

const moment = require('moment')
require('moment-timezone')

tokyo = moment.tz('2019-01-10 07:30:20', 'Asia/Tokyo')
losAngeles = tokyo.clone().tz('America/Los_Angeles')
london = tokyo.clone().tz('Europe/London')

tokyo.format()       // '2019-01-10T07:30:20+09:00'
losAngeles.format()  // '2019-01-09T14:30:20-08:00'
london.format()      // '2019-01-09T22:30:20Z'

参考