九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さて、前々回に全61件!Moment.js日付フォーマット実例という記事を公開しました。この記事では日付を色々なフォーマットで取得する方法をまとめましたが、実はMoment.jsにはまだまだ便利な機能があります。
そこで、今回は
- 日付・時間の操作 ・・・ 時間を進めたり戻したりする
- 日付の比較 ・・・ 前か後か同じかなどをチェックする
の2点にフォーカスしてまとめます。
ぜひ日付フォーマットと合わせて参考にしてみてください。
実行環境
Moment.js: バージョン 2.22.2
目次
- 1 Add()で時間を進める
- 2 subtract()で時間を戻す
- 3 startOf()で開始場所を指定して移動させる
- 4 endOf()で終了場所を指定して移動させる
- 5 isBefore()で前の時間かどうかをチェックする
- 6 isSame()で同じ時間かどうかをチェックする
- 7 isAfter()で後の時間かどうかをチェックする
- 8 isSameOrBefore()で前の時間、もしくは同じ時間かどうかをチェックする
- 9 isSameOrAfter()で後の時間、もしくは同じ時間かどうかをチェックする
- 10 isBetween()で範囲内かチェックする
- 11 isDST()でサマータイムかどうかをチェックする
- 12 isLeapYear()でうるう年かどうかをチェックする
- 13 isMoment()でMomentJSのオブジェクトかどうかをチェックする
- 14 isDate()でDateオブジェクトかどうかをチェックする
- 15 おわりに
Add()で時間を進める
「時」「分」「秒」などを指定して時間を進める
年を進める
例えば、「2018年1月1日」から3年進める場合です。
moment('2018-01-01').add(3, 'years'); // 2021年01月01日
指定文字はyear
、y
でも同じ結果になります。
月を進める
例えば、「2018年1月1日」から3ヵ月進める場合です。
moment('2018-01-01').add(3, 'months'); // 2018年04月01日
指定文字はmonth
、M
でも同じ結果になります。
日を進める
例えば、「2018年1月1日」から3日進める場合です。
moment('2018-01-01').add(3, 'days'); // 2018年01月04日
指定文字はday
、d
でも同じ結果になります。
時を進める
例えば、「2018年1月1日 17時00分」から3時間進める場合です。
moment('2018-01-01 17:00').add(3, 'hours'); // 2018年1月1日 20:00
指定文字はhour
、H
でも同じ結果になります。
分を進める
例えば、「2018年1月1日 17時00分」から30分進める場合です。
moment('2018-01-01 17:00').add(30, 'minutes'); // 2018年1月1日 17:30
指定文字はminute
、m
でも同じ結果になります。
秒を進める
例えば、「2018年1月1日 17時00分00秒」から30秒進める場合です。
moment('2018-01-01 17:00:00').add(30, 'seconds'); // 2018年1月1日 17:00:30
指定文字はsecond
、s
でも同じ結果になります。
ミリ秒を進める
例えば、「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
指定文字はmillisecond
、ms
でも同じ結果になります。
4半期(3ヵ月)進める
例えば、「2018年4月15日」から「四半期」を1つ進める場合です。
moment('2018-04-15').add(1, 'quarters'); // 2018年7月15日
指定文字はquarter
、Q
でも同じ結果になります。
数値を指定して時間を進める
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日
指定文字はyear
、y
でも同じ結果になります。
月を戻す
例えば、「2018年12月1日」から3ヵ月戻す場合です。
moment('2018-12-01').subtract(3, 'months'); // 2018年9月1日
指定文字はmonth
、M
でも同じ結果になります。
日を戻す
例えば、「2018年1月31日」から3日戻す場合です。
moment('2018-01-31').subtract(3, 'days'); // 2018年1月28日
指定文字はday
、d
でも同じ結果になります。
時を戻す
例えば、「2018年1月1日 17時00分」から3時間戻す場合です。
moment('2018-01-01 17:00').subtract(3, 'hours'); // 2018年1月1日 14:00
指定文字はhour
、H
でも同じ結果になります。
分を戻す
例えば、「2018年1月1日 17時00分」から30分戻す場合です。
moment('2018-01-01 17:00').subtract(30, 'minutes'); // 2018年1月1日 16:30
指定文字はminute
、m
でも同じ結果になります。
秒を戻す
例えば、「2018年1月1日 17時00分00秒」から30秒戻す場合です。
moment('2018-01-01 17:00:00').subtract(3, 'seconds'); // 2018年1月1日 16:59:57
指定文字はsecond
、s
でも同じ結果になります。
ミリ秒を戻す
例えば、「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
指定文字はmillisecond
、ms
でも同じ結果になります。
4半期(3ヵ月)戻す
例えば、「2018年4月15日」から「四半期」を1つ戻す場合です。
moment('2018-04-15').subtract(1, 'quarters'); // 2018年1月15日
指定文字はquarter
、Q
でも同じ結果になります。
数値を指定して時間を戻す
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つのフォーマットを指定するだけです。
(
・・・ 未満。「<」)
・・・ 超。「<」[
・・・ 以下。「<=」]
・・・ 以上。「>=」
実際の例は以下になります。
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
おわりに
今回のまとめで便利さを再実感したのは、isBetween()で「それぞれの範囲を含めるかどうか」を指定するオプションです。
確かに、isSameOrBefore()のようにメソッド名にするには長くなってしまいますし、このライブラリの作者としてもどうするか迷いどころだったはずですが、フォーマットを使うというアイデアは直感的ですしとてもいいですね。
やはり優れたパッケージを学ぶことはスキル向上にもつながります。
ということで、まだ説明できていないMoment.jsの便利機能が残っていますので、今後も機会をみてそちらの部分も記事にしていきます。
ご期待下さい。
ではでは!