JavaScript Moment で日付を扱う #4

株式会社リュディアです。今回は moment での日付の加減算処理についてまとめてみました。掲載するソースコードはすべて GAS の開発環境で動作確認をしています。

Date オブジェクトでの日付の加減算は JavaScript 日付を扱う #3 で扱いました。今回は moment を使って日付の加減算を行ってみます。以下のコードをみてください。

function myMoment3_1() {
 const now = Moment.moment() ;
 
 console.log( now.toString() ) ;

 now.subtract( 3, 'days' ) ;
 console.log( now.toString() ) ;

 now.add( 3, 'days' ) ;
 console.log( now.toString() ) ;
 
 now.subtract( 2, 'months' ) ;
 console.log( now.toString() ) ;

 now.add( 2, 'months' ) ;
 console.log( now.toString() ) ;
}

// 実行結果
// Fri Sep 04 2020 17:25:04 GMT+0900 <- 今日の日付
// Tue Sep 01 2020 17:25:04 GMT+0900 <- 日を 3日だけ減算
// Fri Sep 04 2020 17:25:04 GMT+0900 <- 日を 3日だけ加算(元に戻って今日の日付)
// Sat Jul 04 2020 17:25:04 GMT+0900 <- 月を 2 だけ減算
// Fri Sep 04 2020 17:25:04 GMT+0900 <- 月を 2 だけ加算(元に戻って今日の日付)

日付、時刻の加減算は加算に add、減算に subtract を使います。それぞれ最初の引数で加減算したい値を指定し、次の引数でどの要素を加減算したいか、を指定します。

この例であれば、加減算をする要素として days、months を指定しています。要素の指定は days の代わりに d 、months の代わりに m のみでも問題ないです。また注意すべきことは now.add( 3, 'days' ) は now の要素を破壊的に書き換えます。演算結果が戻り値となるわけではないので注意が必要です。

日付の演算を行う際に元の日付、例では now を破壊せずに演算結果が必要な場合があります。次のコードのように他の変数にコピーして演算を行うとどうなるでしょうか。

function myMoment3_2() {
 const now = Moment.moment() ;
 
 const nowCopy  = now;
 
 console.log( now.toString() ) ;
 console.log( nowCopy.toString() ) ;
 
 nowCopy.add( 3, 'days' ) ;  
 console.log( now.toString() ) ;
 console.log( nowCopy.toString() ) ;
}

// 実行結果
// Sun Sep 06 2020 08:30:59 GMT+0900
// Sun Sep 06 2020 08:30:59 GMT+0900
// Wed Sep 09 2020 08:30:59 GMT+0900 <- 期待した動作と異なる
// Wed Sep 09 2020 08:30:59 GMT+0900

新しい変数 nowCopy に nowCopy = now として nowCopy に対して 3 日の加算を行います。実行結果を見てもらうとわかりますが、nowCopy だけでなく元の now にも加算が行われていることがわかりますね。nowCopy = now はC言語などでいうポインタが作られただけで実体は同じです。そのためこのような現象が発生します。代入については別途まとめますが、ここでは nowCopy = now は nowCopy に now のコピーが作られているわけではないことに注意してください。

ではどうすればよいのでしょうか?次のコードをみてください。

function myMoment3_3() {
 const now = Moment.moment() ;
 
 const nowClone = now.clone();
 
 console.log( now.toString() ) ;
 console.log( nowClone.toString() ) ;
 
 nowClone.add( 3, 'days' ) ;
 console.log( now.toString() ) ;
 console.log( nowClone.toString() ) ;
}

// 実行結果
// Sun Sep 06 2020 08:32:40 GMT+0900
// Sun Sep 06 2020 08:32:40 GMT+0900
// Sun Sep 06 2020 08:32:40 GMT+0900
// Wed Sep 09 2020 08:32:40 GMT+0900

clone を使って新しい変数 nowClone = now.clone( ) とし、nowClone に 3 日の加算を行いました。実行結果を見ると nowClone のみ 3 日の加算が行われており、now は元の日付が保持されていますね。元の日付を保持したい場合は clone で新しい変数を作ってください。

今回は moment での日付の演算を行いました。注意事項として値の複製を用意する場合は clone を使うことも記載しました。

では、ごきげんよう。



この記事が気に入ったらサポートをしてみませんか?