別の Date オブジェクトより 30 分後の Date オブジェクトを取得したいと思います。JavaScript でどのように行うのですか?
27 に答える
ライブラリの使用
多くの日付処理を行っている場合は、DatejsやMoment.jsなどの JavaScript 日付ライブラリを調べることをお勧めします。たとえば、Moment.js の場合、これは単純に次のようになります。
var newDateObj = moment(oldDateObj).add(30, 'm').toDate();
バニラ Javascript
これはchaos's answer のようなものですが、1 行で:
var newDateObj = new Date(oldDateObj.getTime() + diff*60000);
diff
さんの時間から必要な分の差はどこにありますかoldDateObj
。マイナスになることさえあります。
または、複数の場所でこれを行う必要がある場合は、再利用可能な関数として:
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
これが明らかでない場合に備えて、分を掛けるの60000
は、分をミリ秒に変換するためです。
バニラ Javascript には注意してください。デートは難しい!
明日の日付を取得するには、日付に 24 時間を追加できると思うかもしれません。違う!
addMinutes(myDate, 60*24); //DO NOT DO THIS
ユーザーが夏時間を遵守している場合、1 日は必ずしも 24 時間ではありません。1 年に 23 時間しかない日が 1 日と、25 時間しかない日が 1 日あります。たとえば、米国とカナダのほとんどでは、2014 年 11 月 2 日の午前 0 時から 24 時間後でも 11 月 2 日です。
const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!
これが、これを使用して多くの作業を行う必要がある場合、前述のライブラリのいずれかを使用する方が安全な理由です。
以下は、私が書いたこの関数のより一般的なバージョンです。ライブラリを使用することをお勧めしますが、それはプロジェクトにとってやり過ぎ/不可能かもしれません。構文は、MySQL DATE_ADD関数をモデルにしています。
/**
* Adds time to a date. Modelled after MySQL DATE_ADD function.
* Example: dateAdd(new Date(), 'minute', 30) //returns 30 minutes from now.
* https://stackoverflow.com/a/1214753/18511
*
* @param date Date to start with
* @param interval One of: year, quarter, month, week, day, hour, minute, second
* @param units Number of units of the given interval to add.
*/
function dateAdd(date, interval, units) {
if(!(date instanceof Date))
return undefined;
var ret = new Date(date); //don't change original date
var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
switch(String(interval).toLowerCase()) {
case 'year' : ret.setFullYear(ret.getFullYear() + units); checkRollover(); break;
case 'quarter': ret.setMonth(ret.getMonth() + 3*units); checkRollover(); break;
case 'month' : ret.setMonth(ret.getMonth() + units); checkRollover(); break;
case 'week' : ret.setDate(ret.getDate() + 7*units); break;
case 'day' : ret.setDate(ret.getDate() + units); break;
case 'hour' : ret.setTime(ret.getTime() + units*3600000); break;
case 'minute' : ret.setTime(ret.getTime() + units*60000); break;
case 'second' : ret.setTime(ret.getTime() + units*1000); break;
default : ret = undefined; break;
}
return ret;
}
var d1 = new Date (),
d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);
たぶん、このようなものですか?
var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);
console.log(v)
addSeconds
JSで日付を操作するためにaddMinutes
、私は常に7つの関数を作成します:、、、、、、、。addHours
addDays
addWeeks
addMonths
addYears
ここで例を見ることができます: http://jsfiddle.net/tiagoajacobi/YHA8x/
使い方:
var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));
これらは関数です:
Date.prototype.addSeconds = function(seconds) {
this.setSeconds(this.getSeconds() + seconds);
return this;
};
Date.prototype.addMinutes = function(minutes) {
this.setMinutes(this.getMinutes() + minutes);
return this;
};
Date.prototype.addHours = function(hours) {
this.setHours(this.getHours() + hours);
return this;
};
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + days);
return this;
};
Date.prototype.addWeeks = function(weeks) {
this.addDays(weeks*7);
return this;
};
Date.prototype.addMonths = function (months) {
var dt = this.getDate();
this.setMonth(this.getMonth() + months);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Date.prototype.addYears = function(years) {
var dt = this.getDate();
this.setFullYear(this.getFullYear() + years);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Moment.js の使用をやめる
他の素晴らしい回答で推奨されているように、ほとんどの場合、日付を扱うときにライブラリを使用するのが最善です。ただし、2020 年 9 月の時点で Moment.js はレガシーと見なされており、新しいプロジェクトでは使用しないでください。
公式ドキュメントで Moment の声明を引用する:
Moment を今後の新しいプロジェクトで使用することはお勧めしません。[...] 現在、私たちは通常、Moment を保守モードのレガシー プロジェクトと見なしています。それは死んでいませんが、確かに完成しています。
現代の図書館
以下は、Moment が推奨する代替案です。
ルクソン
Luxon は Moment の進化版と考えることができます。これは、Moment に長年貢献しているIsaac Cambronによって作成されました。Luxon が存在する理由をお読みください。Luxon ドキュメントのFor Moment ユーザーページ。
- ロケール:
Intl
提供 - タイムゾーン:
Intl
提供
import {DateTime} from 'luxon'
function addMinutes(date, minutes) {
return DateTime.fromJSDate(date).plus({minutes}).toJSDate()
}
Day.js
Day.js は、同様の API を使用して、Moment.js を最小限に置き換えるように設計されています。これはドロップインの代替ではありませんが、Moment の API の使用に慣れていて、すぐに動きたい場合は、Day.js の使用を検討してください。
- ロケール: 個別にインポートできるカスタム データ ファイル
- タイムゾーン:
Intl
プラグイン経由で提供
import dayjs from 'dayjs'
function addMinutes(date, minutes) {
return dayjs(date).add(minutes, 'minutes').toDate()
}
日付-fns
Date-fns は、JavaScriptDate
オブジェクトを操作するための一連の関数を提供します。詳細については、「date-fns を使用する理由」までスクロールしてください。date-fns ホームページで。
- ロケール: 個別にインポートできるカスタム データ ファイル
- タイム ゾーン:
Intl
別の付属ライブラリを介して提供
import {addMinutes} from 'date-fns'
function addMinutesDemo(date, minutes) {
return addMinutes(date, minutes)
}
js-ジョーダ
js-Joda は、Java SE 8パッケージの JSR-310 実装のベースであるJava のThree-Ten Backportの JavaScript ポートです。、Joda-Time、またはNoda Timejava.time
に精通している場合は、js-Joda が同等であることがわかります。java.time
- ロケール: アドオン モジュールによるカスタム データ ファイル
- タイム ゾーン: アドオン モジュールによるカスタム データ ファイル
import {LocalDateTime, nativeJs, convert} from '@js-joda/core'
function addMinutes(date, minutes) {
return convert(
LocalDateTime.from(
nativeJs(date)
).plusMinutes(minutes)
).toDate()
}
現在の日付の値を取得して (ms) で日付を取得し、それに (30 * 60 *1000) を追加する必要があります。これで、ms で (現在の日付 + 30 分) になりました
console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))
これが私のワンライナーです:
console.log('time: ', new Date(new Date().valueOf() + 60000))
時間計算の処理に伴う癖を処理することが知られている既存のライブラリを使用します。私の現在のお気に入りはmoment.jsです。
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
var now = moment(); // get "now"
console.log(now.toDate()); // show original date
var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
console.log(thirty.toDate()); // show new date
</script>
私のような怠け者のために:
「列挙型」を使用し、同じオブジェクトを操作する、コーヒースクリプトでのキップの答え(上から):
Date.UNIT =
YEAR: 0
QUARTER: 1
MONTH: 2
WEEK: 3
DAY: 4
HOUR: 5
MINUTE: 6
SECOND: 7
Date::add = (unit, quantity) ->
switch unit
when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
when Date.UNIT.DAY then @setDate(@getDate() + quantity)
when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
else throw new Error "Unrecognized unit provided"
@ # for chaining
私が書いたちょうど別のオプション:
これが必要なすべての日付処理である場合はやり過ぎですが、必要なことは実行されます。
日付/時刻の書式設定、日付の計算 (日付部分の加算/減算)、日付の比較、日付の解析などをサポートしています。自由にオープン ソース化されています。