JavaScript、Date型でこういう操作をしたい
- 年月日の加算・減算
- 時間分秒の加算・減算
- ミリ秒の加算・減算
これには決まったやり方があるので、
年月日・時分秒ごとの方法を紹介します。
汎用的なコード例は次の通りです。
このページの目次
西暦年(year)にn年だけ加算/減算
最初は西暦年にn年だけ加算するやり方
これにはsetFullYear()を使います。
▼ このメソッドの重要なポイント
Date.prototype.setFullYear() : setFullYear() メソッドは、地方時に基づき、指定された日付の「年」を設定します。新しいタイムスタンプを返します。
引用元 : https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear
「新しいタイムスタンプを返します」
ここが重要なポイントであり、後述する setMonth(), setDate(), 他時間セット系メソッドでも同様です。必ず新タイムスタンプを返すってコト
Date型を直接返すわけではありません。
それを踏まえてDateにn年加算する方法です。
▼ n年だけ西暦に加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 |
function addYears(date, n){ date.setFullYear(date.getFullYear() + n) } let date = new Date(); console.log(date.toLocaleDateString()) /// => 2023/02/20 /// 15年だけ加算 addYears(date,15) console.log(date.toLocaleDateString()) /// => 2038/02/20 |
こういうコード。現時点の西暦を Date.getFullYear() からゲットし、Date.setFullYear() が新タイムスタンプを返す特性を利用して新しいDateを返してます。
この流れは月日・時分秒でも同じです(一部例外あり)
月(month)にnカ月だけ加算/減算
Date型の月はmonthで表されます。
だからこのようなコードを書けばOKです。
▼ nカ月だけDateに加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function addMonths(date, n){ const orgDate = new Date(date.getTime()); date.setMonth(date.getMonth() + n) /// 月またぎの調整 if (orgDate.getDate() > date.getDate()) { date.setDate(0); } } let date = new Date(); console.log(date.toLocaleDateString()) /// => 2023/2/20 /// +6カ月分だけ年間を加算 addMonths(date,6) console.log(date.toLocaleDateString()) /// => 2023/8/20 /// さらに+6カ月して年またぎすると…?? addMonths(date, 6) console.log(date.toLocaleDateString()) /// => 2024/2/20 /// 月末で月またぎすると…?? let date2 = new Date("2023/01/31") addMonths(date2, 1); console.log(date2.toLocaleDateString()) /// => 2023/2/28 |
もし年をまたぐなら、そのように調整されます。
厄介なのが月末で月をまたぐケースです。
もし 2023/01/31 に1カ月だけ加算する場合、なんと 2023/2/31 になります。そんな日付はないからDate型が気を利かせて 2023/03/01 に修正されます。
それだと不都合だから月またぎでは修正しました。
▼ このqiita記事を参考にした
月またぎには少し注意が必要です。
日数(date)にn日間を加算/減算
Date型では日数はdateから参照できます。
それにn日間だけ加算・減算するにはこうです。
▼ n日間だけDateに加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 |
function addDays(date, n){ date.setDate(date.getDate() + n) } let date = new Date(); console.log(date.toLocaleDateString()) /// => 2023/02/20 /// 10日間だけ加算 addDays(date,10) console.log(date.toLocaleDateString()) /// => 2023/3/2 |
月またぎが発生しても自動で調整されます。
その点は月加算よりも楽です。
時間(hours)にn時間だけ加算/減算
Date型での時間は hours で表されます。
それをn時間だけ加算・減算するやり方です。
▼ n時間だけDateに加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function addHours(date, n){ date.setHours(date.getHours() + n) } let date = new Date(); console.log(date.toLocaleString()) /// => 2023/2/20 13:02:00 /// +4時間だけ加算する addHours(date,4) console.log(date.toLocaleString()) /// => 2023/2/20 17:02:00 /// さらに+20時間して日をまたぐと… addHours(date,20) console.log(date.toLocaleString()) /// => 2023/2/21 13:02:00 |
日をまたぐ加算・減算でも調整してくれます。
ちなみに時間は 0 ~ 23 までの範囲です。
分(minutes)にn分だけ加算/減算
Date型では分はminutesで表現されます。
これにn分だけ加算・減算するような場合です。
▼ n分間だけDateに加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function addMinutes(date, n){ date.setMinutes(date.getMinutes() + n) } let date = new Date(); console.log(date.toLocaleString()) /// => 2023/2/20 13:05:32 /// +25分間だけ加算する addMinutes(date,25) console.log(date.toLocaleString()) /// => 2023/2/20 13:30:32 /// さらに+60分だけ加算する addMinutes(date,60) console.log(date.toLocaleString()) /// => 2023/2/20 14:30:32 |
ちなみに分数は 0 ~ 23 までの範囲です。
あとは特筆すべきことは多分ない
秒(seconds)にn秒だけ加算/減算
Date型では秒数はsecondsで表されます。
それにn秒間だけ加算・減算する方法です。
▼ n秒間をDateに加算・減算するコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function addSeconds(date, n){ date.setSeconds(date.getSeconds() + n) } let date = new Date(); console.log(date.toLocaleString()) /// => 2023/2/20 13:09:29 /// +10秒だけ加算する addSeconds(date,10) console.log(date.toLocaleString()) /// => 2023/2/20 13:09:39 /// さらに+50秒だけ加算する addSeconds(date,50) console.log(date.toLocaleString()) /// => 2023/2/20 13:10:29 |
ちなみに秒数も 0 ~ 59 までの範囲です。
ミリ秒も同じ方法で加算・減算できます。
やることは同じなのでミリ秒は省略
ちなみにDatejsなどライブラリを使う手も
蛇足だけど、こういう日付を扱えるライブラリもあります。
▼ Github:datejs / Datejs
▼ Datejsでのの加算・減算のコード例
1 2 3 4 5 6 7 8 9 10 |
Date.today().add({ days: 2 }) // Adds 2 days to the Date. Other object values include year|month|day|hour|minute|second. Date.today().add({ years: -1, months: 6, hours: 3 }) Date.today().addYears(1) // Adds 1 year. Date.today().addMonths(-2) // Subtracts 2 months. Date.today().addWeeks(1) // Adds 1 week. Date.today().addDays(4) // Adds 4 days. Date.today().addHours(6) // Adds 6 hours. Date.today().addMinutes(-30) // Subtracts 30 minutes. Date.today().addSeconds(15) // Adds 15 seconds. Date.today().addMilliseconds(200) // Adds 200 milliseconds. |
※ 残念ながらMITライセンスではない模様
頻繁にDateTimeを扱うなら導入という手もあります。
Date型に加算・減算は難しくはない
上記のライブラリを使うほどでもないです。
頻度が高くないなら、自前でコードを書く方がいいかも
あと日付関連ではこんな記事も書いてます。
以上、JavaScriptでDate型に加算・減算でした。