JavaScriptで日付オブジェクトをコピーする際、単に代入するだけだと予期しないことが起きます。
日付オブジェクトの作り方
次のようにして、日付オブジェクトを作ります。
今日の日付がセットされます。正確には現時点の時分秒もセットされます。
date_obj = new Date();
次のようにして、年月日を指定します。月は「1月」は「0」、「2月」は「1」となります。
date_obj = new Date(2023, 8 - 1, 1);
日付のコピー(間違った方法)
日付のコピーをする一般的な例です。
base_date = new Date();
console.log(base_date); // Tue Aug 01 2023 14:47:51 GMT+0900 (日本標準時)
new_date = base_date;
new_date.setFullYear(2020);
console.log(new_date); // Sat Aug 01 2020 14:47:51 GMT+0900 (日本標準時)
console.log(base_date); // Sat Aug 01 2020 14:47:51 GMT+0900 (日本標準時)
console.log(base_date); // Tue Aug 01 2023 14:47:51 GMT+0900 (日本標準時)
new_date = base_date;
new_date.setFullYear(2020);
console.log(new_date); // Sat Aug 01 2020 14:47:51 GMT+0900 (日本標準時)
console.log(base_date); // Sat Aug 01 2020 14:47:51 GMT+0900 (日本標準時)
base_dateに元の日付をセットし、new_dateにコピーをします。
new_dateの年を「2020」にします。
するとnew_dateが2020年になるのは分かるのですが、base_dateまで2020年になってしまいます。
日付オブジェクトのコピーをするとコピー先の操作をするとコピー元にも反映されてしまいます。
つまり配列のコピーと同じ動きをするということです。
これを知らないと思わぬミスをします。
意図して行う場合以外は避けるべきです。
日付のコピー(正しい方法)
元の日付オブジェクトに影響しないようにコピーするにはgetTimeを使ってタイムスタンプを取り、これで新たに日付オブジェクトを作るという方法を使うことが多いようです。
base_date = new Date();
console.log(base_date);
new_date = new Date(base_date.getTime());
new_date.setFullYear(2020);
console.log(new_date);
console.log(base_date);
console.log(base_date);
new_date = new Date(base_date.getTime());
new_date.setFullYear(2020);
console.log(new_date);
console.log(base_date);
コメント