979

別の Date オブジェクトより 30 分後の Date オブジェクトを取得したいと思います。JavaScript でどのように行うのですか?

4

27 に答える 27

1154

ライブラリの使用

多くの日付処理を行っている場合は、DatejsMoment.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;
}

動作中の jsFiddle デモ

于 2009-07-31T20:36:54.860 に答える
320
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
于 2009-07-29T03:40:46.163 に答える
197

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);

于 2009-07-29T03:38:40.427 に答える
127

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);

于 2010-06-14T13:58:01.623 に答える
62

たぶん、このようなものですか?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)

于 2009-07-29T03:39:06.290 に答える
53


addSecondsJSで日付を操作するためにaddMinutes、私は常に7つの関数を作成します:、、、、、、、。addHoursaddDaysaddWeeksaddMonthsaddYears

ここで例を見ることができます: 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;
};
于 2014-03-19T19:14:08.607 に答える
15

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()
}
于 2021-04-02T13:28:41.163 に答える
9

現在の日付の値を取得して (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)))

于 2020-04-20T00:34:32.347 に答える
5

これが私のワンライナーです:

console.log('time: ', new Date(new Date().valueOf() + 60000))

于 2020-03-13T09:14:31.087 に答える
3

時間計算の処理に伴う癖を処理することが知られている既存のライブラリを使用します。私の現在のお気に入りは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>
于 2016-06-16T21:18:26.933 に答える
2

私のような怠け者のために:

「列挙型」を使用し、同じオブジェクトを操作する、コーヒースクリプトでのキップの答え(上から):

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
于 2015-02-19T16:13:49.177 に答える
1

私が書いたちょうど別のオプション:

DP_DateExtensions ライブラリ

これが必要なすべての日付処理である場合はやり過ぎですが、必要なことは実行されます。

日付/時刻の書式設定、日付の計算 (日付部分の加算/減算)、日付の比較、日付の解析などをサポートしています。自由にオープン ソース化されています。

于 2009-08-14T15:45:24.810 に答える