全89項目!Moment.js日付の操作&比較・実例

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さて、前々回に全61件!Moment.js日付フォーマット実例という記事を公開しました。この記事では日付を色々なフォーマットで取得する方法をまとめましたが、実はMoment.jsにはまだまだ便利な機能があります。

そこで、今回は

  • 日付・時間の操作 ・・・ 時間を進めたり戻したりする
  • 日付の比較 ・・・ 前か後か同じかなどをチェックする

の2点にフォーカスしてまとめます。

ぜひ日付フォーマットと合わせて参考にしてみてください。

実行環境

Moment.js: バージョン 2.22.2

目次

Add()で時間を進める

「時」「分」「秒」などを指定して時間を進める

年を進める

例えば、「2018年1月1日」から3年進める場合です。

moment('2018-01-01').add(3, 'years'); // 2021年01月01日

指定文字はyearyでも同じ結果になります。

月を進める

例えば、「2018年1月1日」から3ヵ月進める場合です。

moment('2018-01-01').add(3, 'months'); // 2018年04月01日

指定文字はmonthMでも同じ結果になります。

日を進める

例えば、「2018年1月1日」から3日進める場合です。

moment('2018-01-01').add(3, 'days'); // 2018年01月04日

指定文字はdaydでも同じ結果になります。

時を進める

例えば、「2018年1月1日 17時00分」から3時間進める場合です。

moment('2018-01-01 17:00').add(3, 'hours'); // 2018年1月1日 20:00

指定文字はhourHでも同じ結果になります。

分を進める

例えば、「2018年1月1日 17時00分」から30分進める場合です。

moment('2018-01-01 17:00').add(30, 'minutes'); // 2018年1月1日 17:30

指定文字はminutemでも同じ結果になります。

秒を進める

例えば、「2018年1月1日 17時00分00秒」から30秒進める場合です。

moment('2018-01-01 17:00:00').add(30, 'seconds'); // 2018年1月1日 17:00:30

指定文字はsecondsでも同じ結果になります。

ミリ秒を進める

例えば、「2018年1月1日 17時00分00.000秒」から30ミリ秒進める場合です。

moment('2018-01-01 17:00:00.000').add(3, 'milliseconds'); // 2018年1月1日 17:00:00.030

指定文字はmillisecondmsでも同じ結果になります。

4半期(3ヵ月)進める

例えば、「2018年4月15日」から「四半期」を1つ進める場合です。

moment('2018-04-15').add(1, 'quarters'); // 2018年7月15日

指定文字はquarterQでも同じ結果になります。

数値を指定して時間を進める

moment('2018-01-01').add(86400000); // 1日。2018年1月2日
moment('2018-01-01 17:00').add(3600000); // 1時間。2018年1月1日 18:00
moment('2018-01-01 17:00').add(60000); // 1分。2018年1月1日 17:01
moment('2018-01-01 17:00:00').add(1000); // 1秒。2018年1月1日 17:00:01
moment('2018-01-01 17:00:00.000').add(1); // 1ミリ秒。2018年1月1日 17:00:00.001

※指定する数値は「ミリ秒」です。

オブジェクトで各時刻を進める

例えば、「2018年1月1日 0時0分0.000秒」から1年、1ヵ月、1分、1時間、1分、1秒、1ミリ秒をそれぞれ進める場合です。

moment('2018-01-01 00:00:00.000').add({
    years: 1,
    months: 1,
    day: 1,
    hours: 1,
    minutes: 1,
    seconds: 1,
    milliseconds: 1
});

// 2019年2月2日 01:01:01.001

subtract()で時間を戻す

「時」「分」「秒」などを指定して時間を戻す

年を戻す

例えば、「2018年1月1日」から3年戻す場合です。

moment('2018-01-01').subtract(3, 'years'); // 2015年01月01日

指定文字はyearyでも同じ結果になります。

月を戻す

例えば、「2018年12月1日」から3ヵ月戻す場合です。

moment('2018-12-01').subtract(3, 'months'); // 2018年9月1日

指定文字はmonthMでも同じ結果になります。

日を戻す

例えば、「2018年1月31日」から3日戻す場合です。

moment('2018-01-31').subtract(3, 'days'); // 2018年1月28日

指定文字はdaydでも同じ結果になります。

時を戻す

例えば、「2018年1月1日 17時00分」から3時間戻す場合です。

moment('2018-01-01 17:00').subtract(3, 'hours'); // 2018年1月1日 14:00

指定文字はhourHでも同じ結果になります。

分を戻す

例えば、「2018年1月1日 17時00分」から30分戻す場合です。

moment('2018-01-01 17:00').subtract(30, 'minutes'); // 2018年1月1日 16:30

指定文字はminutemでも同じ結果になります。

秒を戻す

例えば、「2018年1月1日 17時00分00秒」から30秒戻す場合です。

moment('2018-01-01 17:00:00').subtract(3, 'seconds'); // 2018年1月1日 16:59:57

指定文字はsecondsでも同じ結果になります。

ミリ秒を戻す

例えば、「2018年1月1日 17時00分00.000秒」から30ミリ秒戻す場合です。

moment('2018-01-01 17:00:00.000').subtract(3, 'milliseconds'); // 2018年1月1日 16:59:59.997

指定文字はmillisecondmsでも同じ結果になります。

4半期(3ヵ月)戻す

例えば、「2018年4月15日」から「四半期」を1つ戻す場合です。

moment('2018-04-15').subtract(1, 'quarters'); // 2018年1月15日

指定文字はquarterQでも同じ結果になります。

数値を指定して時間を戻す

moment('2018-01-01').subtract(86400000); // 1日。2017年12月31日
moment('2018-01-01 17:00').subtract(3600000); // 1時間。2018年1月1日 16:00
moment('2018-01-01 17:00').subtract(60000); // 1分。2018年1月1日 16:59
moment('2018-01-01 17:00:00').subtract(1000); // 1秒。2018年1月1日 16:59:59
moment('2018-01-01 17:00:00.000').subtract(1); // 1ミリ秒。2018年1月1日 16:59:59.999

※指定する数値は「ミリ秒」です。

オブジェクトで各時刻を戻す

例えば、「2011年11月11日 11時11分11.111秒」から1年、1ヵ月、1分、1時間、1分、1秒、1ミリ秒をそれぞれ戻す場合です。

moment('2011-11-11 11:11:11.111').subtract({
    years: 1,
    months: 1,
    day: 1,
    hours: 1,
    minutes: 1,
    seconds: 1,
    milliseconds: 1
});

// 2010年10月10日 10:10:10.110

startOf()で開始場所を指定して移動させる

年の始めに移動

例えば、「2018年7月1日」から年の始めに移動させる場合です。

moment('2018-07-01').startOf('year'); // 2018年1月1日

月の始めに移動

例えば、「2018年7月15日」から月の始めに移動させる場合です。

moment('2018-07-15').startOf('month'); // 2018年7月1日

日の始めに移動

例えば、「2018年7月15日 17時00分」から月の始めに移動させる場合です。

moment('2018-07-15 17:00').startOf('day'); // 2018年7月15日 00:00

時の始めに移動

例えば、「2018年7月15日 17時33分」から時の始めに移動させる場合です。

moment('2018-07-15 17:33').startOf('hour'); // 2018年7月15日 17:00

分の始めに移動

例えば、「2018年7月15日 17時33分44秒」から分の始めに移動させる場合です。

moment('2018-07-15 17:33:44').startOf('minute'); // 2018年7月15日 17:33:00

秒の始めに移動

例えば、「2018年7月15日 17時33分44.555秒」から秒の始めに移動させる場合です。

moment('2018-07-15 17:33:44.555').startOf('second'); // 2018年7月15日 17:33:44.000

endOf()で終了場所を指定して移動させる

年の終わりに移動

例えば、「2018年7月1日」から年の終わりに移動させる場合です。

moment('2018-07-01').endOf('year'); // 2018年12月31日

月の終わりに移動

例えば、「2018年7月15日」から月の終わりに移動させる場合です。

moment('2018-07-15').endOf('month'); // 2018年7月31日

日の終わりに移動

例えば、「2018年7月15日 17時00分」から月の終わりに移動させる場合です。

moment('2018-07-15 17:00').endOf('day'); // 2018年7月15日 23:59

時の終わりに移動

例えば、「2018年7月15日 17時33分」から時の終わりに移動させる場合です。

moment('2018-07-15 17:33').endOf('hour'); // 2018年7月15日 17:59

分の終わりに移動

例えば、「2018年7月15日 17時33分44秒」から分の終わりに移動させる場合です。

moment('2018-07-15 17:33:44').endOf('minute'); // 2018年7月15日 17:33:59

秒の終わりに移動

例えば、「2018年7月15日 17時33分44.555秒」から秒の終わりに移動させる場合です。

moment('2018-07-15 17:33:44.555').endOf('second'); // 2018年7月15日 17:33:44.999

isBefore()で前の時間かどうかをチェックする

moment('2018-01-01').isBefore('2018-01-02'); // true

moment('2018-01-01').isBefore(1514818800000); // true, 1514818800000 は 2018/01/02

var dt = moment({
    year: 2018,
    month: 1, // 2月
    day: 1
});
moment('2018-01-01').isBefore(dt); // true

※isBefore()は同じ日時はfalseになります。もし、同じ日時も含めたい場合はisSameOrBefore()を使ってください。

年で前の時間かチェック

moment('2017-01-01').isBefore('2018-01-01', 'year'); // true

年、月で前の時間かチェック

moment('2018-04-01').isBefore('2018-05-01', 'month'); // true

年、月、日で前の時間かチェック

moment('2018-05-01').isBefore('2018-05-02', 'day'); // true

年、月、日、時で前の時間かチェック

moment('2018-05-01 17:00').isBefore('2018-05-01 18:00', 'hour'); // true

年、月、日、時、分で前の時間かチェック

moment('2018-05-01 17:30').isBefore('2018-05-01 17:35', 'minute'); // true

年、月、日、時、分、秒で前の時間かチェック

moment('2018-05-01 17:30:15').isBefore('2018-05-01 17:30:20', 'second'); // true

isSame()で同じ時間かどうかをチェックする

moment('2018-01-01').isSame('2018-01-01'); // true

moment('2018-01-01').isSame(1514732400000); // true, 1514732400000 は 2018-01-01

var dt = moment({
    year: 2018,
    month: 0, // 1月
    day: 1
});
moment('2018-01-01').isSame(dt); // true

年で同じ時間かチェック

moment('2018-01-01').isSame('2018-02-02', 'year'); // true

年、月で同じ時間かチェック

moment('2018-05-01').isSame('2018-05-31', 'month'); // true

年、月、日で同じ時間かチェック

moment('2018-05-01').isSame('2018-05-01', 'day'); // true

年、月、日、時で同じ時間かチェック

moment('2018-05-01 17:01').isSame('2018-05-01 17:59', 'hour'); // true

年、月、日、時、分で同じ時間かチェック

moment('2018-05-01 17:30:01').isSame('2018-05-01 17:30:59', 'minute'); // true

年、月、日、時、分、秒で同じ時間かチェック

moment('2018-05-01 17:30:15.111').isSame('2018-05-01 17:30:15.222', 'second'); // true

isAfter()で後の時間かどうかをチェックする

moment('2018-01-02').isAfter('2018-01-01'); // true

moment('2018-01-02').isAfter(1514732400000); // true, 1514732400000 は 2018/01/01

var dt = moment({
    year: 2018,
    month: 0, // 1月
    day: 1
});
moment('2018-01-02').isAfter(dt); // true

※isAfter()は同じ日時はfalseになります。もし、同じ日時も含めたい場合はisSameOrAfter()を使ってください。

年で後の時間かチェック

moment('2019-01-01').isAfter('2018-01-01', 'year'); // true

年、月で後の時間かチェック

moment('2018-06-01').isAfter('2018-05-01', 'month'); // true

年、月、日で後の時間かチェック

moment('2018-05-02').isAfter('2018-05-01', 'day'); // true

年、月、日、時で後の時間かチェック

moment('2018-05-01 18:00').isAfter('2018-05-01 17:00', 'hour'); // true

年、月、日、時、分で後の時間かチェック

moment('2018-05-01 17:35').isAfter('2018-05-01 17:30', 'minute'); // true

年、月、日、時、分、秒で後の時間かチェック

moment('2018-05-01 17:30:25').isAfter('2018-05-01 17:30:15', 'second'); // true

isSameOrBefore()で前の時間、もしくは同じ時間かどうかをチェックする

moment('2018-01-01').isSameOrBefore('2018-01-02'); // true

moment('2018-01-01').isSameOrBefore(1514818800000); // true, 1514818800000 は 2018/01/02

var dt = moment({
    year: 2018,
    month: 1, // 2月
    day: 1
});
moment('2018-01-01').isSameOrBefore(dt); // true

※isSameOrBefore()は同じ日時でもtrueになります。もし、同じ日時も除外したい場合はisBefore()を使ってください。

年で前の時間、もしくは同じ時間かチェック

moment('2017-01-01').isSameOrBefore('2018-01-01', 'year'); // true

年、月で前の時間、もしくは同じ時間かチェック

moment('2018-04-01').isSameOrBefore('2018-05-01', 'month'); // true

年、月、日で前の時間、もしくは同じ時間かチェック

moment('2018-05-01').isSameOrBefore('2018-05-02', 'day'); // true

年、月、日、時で前の時間、もしくは同じ時間かチェック

moment('2018-05-01 17:00').isSameOrBefore('2018-05-01 18:00', 'hour'); // true

年、月、日、時、分で前の時間、もしくは同じ時間かチェック

moment('2018-05-01 17:30').isSameOrBefore('2018-05-01 17:35', 'minute'); // true

年、月、日、時、分、秒で前の時間、もしくは同じ時間かチェック

moment('2018-05-01 17:30:15').isSameOrBefore('2018-05-01 17:30:20', 'second'); // true

isSameOrAfter()で後の時間、もしくは同じ時間かどうかをチェックする

moment('2018-01-02').isSameOrAfter('2018-01-01'); // true

moment('2018-01-02').isSameOrAfter(1514732400000); // true, 1514732400000 は 2018/01/01

var dt = moment({
    year: 2018,
    month: 0, // 1月
    day: 1
});
moment('2018-01-02').isSameOrAfter(dt); // true

※isSameOrAfter()は同じ日時でもtrueになります。もし、同じ日時も除外したい場合はisAfter()を使ってください。

年で後の時間、もしくは同じ時間かチェック

moment('2019-01-01').isSameOrAfter('2018-01-01', 'year'); // true

年、月で後の時間、もしくは同じ時間かチェック

moment('2018-06-01').isSameOrAfter('2018-05-01', 'month'); // true

年、月、日で後の時間、もしくは同じ時間かチェック

moment('2018-05-02').isSameOrAfter('2018-05-01', 'day'); // true

年、月、日、時で後の時間、もしくは同じ時間かチェック

moment('2018-05-01 18:00').isSameOrAfter('2018-05-01 17:00', 'hour'); // true

年、月、日、時、分で後の時間、もしくは同じ時間かチェック

moment('2018-05-01 17:35').isSameOrAfter('2018-05-01 17:30', 'minute'); // true

年、月、日、時、分、秒で後の時間、もしくは同じ時間かチェック

moment('2018-05-01 17:30:25').isSameOrAfter('2018-05-01 17:30:15', 'second'); // true

isBetween()で範囲内かチェックする

moment('2018-01-02').isBetween('2018-01-01', '2018-01-03'); // true

moment('2018-01-02').isBetween(1514732400000, 1514905200000); // true, 1514732400000 は 2018-01-01、1514905200000 は 2018-01-03

var dt1 = moment({
    year: 2018,
    month: 0, // 1月
    day: 1
});
var dt2 = moment({
    year: 2018,
    month: 0, // 1月
    day: 3
});
moment('2018-01-02').isBetween(dt1, dt2); // true

年で範囲内かチェック

moment('2018-01-01').isBetween('2017-01-01', '2019-01-01', 'year'); // true

月で範囲内かチェック

moment('2018-06-01').isBetween('2018-05-01', '2018-07-01', 'month'); // true

日で範囲内かチェック

moment('2018-05-02').isBetween('2018-05-01', '2018-05-03', 'day'); // true

時で範囲内かチェック

moment('2018-05-01 17:00').isBetween('2018-05-01 16:00', '2018-05-01 18:00', 'hour'); // true

分で範囲内かチェック

moment('2018-05-01 17:33').isBetween('2018-05-01 17:30', '2018-05-01 17:35', 'minute'); // true

秒で範囲内かチェック

moment('2018-05-01 17:30:25').isBetween('2018-05-01 17:30:15', '2018-05-01 17:30:35', 'second'); // true

isBetween()の同じ値を含めるか除去するかのオプション

isBetween()では以下のような不等式のようなオプション指定ができます。

  • A < B < C
  • A <= B < C
  • A < B <= C
  • A <= B <= C

使い方は第4引数に以下4つのフォーマットを指定するだけです。

  1. ( ・・・ 未満。「<」
  2. ) ・・・ 超。「<」
  3. [ ・・・ 以下。「<=」
  4. ] ・・・ 以上。「>=」

実際の例は以下になります。

A < B < C

moment('2018-01-01').isBetween('2018-01-01', '2018-02-01', null, '()'); // false

A <= B < C

moment('2018-01-01').isBetween('2018-01-01', '2018-02-01', null, '[)'); // true

A < B <= C

moment('2018-07-01').isBetween('2018-01-01', '2018-07-01', null, '(]'); // true

A <= B <= C

moment('2018-07-01').isBetween('2018-07-01', '2018-12-01', null, '[]'); // true

なお、以下のように範囲の開始・終了どちらかがfalseとなる場合、全体の評価は同じくfalseになりますので注意が必要です。

moment('2018-01-01').isBetween('2018-01-01', '2018-01-01', null, '(]'); // false

isDST()でサマータイムかどうかをチェックする

moment('2018-12-01').isDST(); // false

※日本語環境ではどの日付でも「true」にはなりませんでした。

isLeapYear()でうるう年かどうかをチェックする

moment('2020-01-01').isLeapYear(); // true

isMoment()でMomentJSのオブジェクトかどうかをチェックする

var dt = moment();
moment.isMoment(dt); // true

isDate()でDateオブジェクトかどうかをチェックする

var date = new Date();
moment.isDate(date); // true
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

今回のまとめで便利さを再実感したのは、isBetween()で「それぞれの範囲を含めるかどうか」を指定するオプションです。

確かに、isSameOrBefore()のようにメソッド名にするには長くなってしまいますし、このライブラリの作者としてもどうするか迷いどころだったはずですが、フォーマットを使うというアイデアは直感的ですしとてもいいですね。

やはり優れたパッケージを学ぶことはスキル向上にもつながります。

ということで、まだ説明できていないMoment.jsの便利機能が残っていますので、今後も機会をみてそちらの部分も記事にしていきます。

ご期待下さい。

ではでは!

 

このエントリーをはてなブックマークに追加       follow us in feedly