JavaScriptのDateオブジェクトに30分を追加する方法は?


785

別のDateオブジェクトより30分遅いDateオブジェクトを取得したいのですが。JavaScriptを使用するにはどうすればよいですか?


1
小さなカレンダーポップアップスクリプトをjsで作成しました。そのスクリプトはGithub上にあります。おそらくコードを調べて、日付オブジェクトがどのように操作されるかを確認してください。また、特に日付オブジェクトについては、JavaScriptキットをすばらしいjs参照として確認してください。
クリスチャン

2
のバリエーションを使用する以下のすべての回答は、date.setMinutes(date.getMinutes() + ...)夏時間の境界を超えて失敗します。例( '2014-03-09'が夏時間の境界であると想定): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dは、現在より30分早く、遅くはありませんf
Spig

1
@Spig:DST境界の1:59 AMから30分は1:29 AMです。エラーはありません。とを印刷するfd、一方が「GMT-0500」、もう一方が「GMT-0400」(またはタイムゾーンが何であれ)と表示されます。また、との.getTime()両方を呼び出すfdfそれがd(後で)より大きいことがわかります。
Kip

1
@Spig:面白い、Firefoxで試してみたがうまくいった。getMinutes()がどのように機能するかの仕様では、これは灰色の領域に該当すると思います。01:89になるのは02:29、あなたが「春先に進む」日に存在しないからです。Chromeがそれを01:29決定し、FFが決定し03:29ます。夜に「フォールバック」すると、両方のブラウザが「フォールバック」の時間をスキップし、90分前にジャンプし02:29ます。JSFiddleのデモをいくつか示します。「春先に」 / 「後退」
キップ

1
以下の回答のいずれかがあなたの質問に答えた場合、このサイトのしくみは、その回答を「受け入れる」ことになります。しかし、あなたの質問が本当に答えられた場合のみ。そうでない場合は、質問に詳細を追加することを検討してください。
さようならStackExchange 2017

回答:


951

ライブラリを使用する

多くの日付作業を行っている場合は、DatejsMoment.jsなどのJavaScript日付ライブラリを調べてください。たとえば、Moment.jsの場合、これは単純です。

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

バニラJavaScript

これはカオスの答えに似ていますが、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デモ


14
これは非常に強力です。数が負の場合でも、それは任意の分の間機能します。
Wahid Bitar

3
秒の場合、60kではなく1000を掛けます。
ashes999 2015

2
dateAdd()関数は素晴らしいです!しかし、私からのメモが1つあります-意味的に、単位は「分」、「秒」などである必要があり、間隔は量(2、10、45、...)である必要があり、その逆ではありません。そうでなければアイデアは良いです。
Vasil Popov

1
この回答は月のロールオーバーに対応できないため、うるう年かどうかに応じて、1月31日と1か月に1か月を加算すると3月2日または3月になります。Jacobiの答えのaddMonths関数とaddYears関数はこれを処理するので、私にとっては、より良い答えです。
RobG 2017年

1
@RobG良い点。これに対する修正を追加し、「可能であればライブラリを使用する」というポイントをさらに強調しました。
2017年

238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

114
@ジェイミー:2つのDateオブジェクトは必要ありません。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
グラントワグナー

15
@グラント:d2 =「日付オブジェクトを取得したい」と想定し、d1 =「別の日付オブジェクトへ」
Jamie

7
@ CKeene、setMinutes、およびgetMinutesは、プレーンな古いJavaScriptの一部です(ただし、datejsは他の多くのものを提供します)。
2012

4
参考までにこれは、夏時間の境界を越える可能性があります。JSFiddleデモ:「スプリングフォワード」 / 「フォールバック」 (@Spigに感謝)
Kip

@trevorgrayson指定したパラメーターが予想範囲外の場合、setMinutes()はそれに応じて日付情報を更新しようとします。たとえば、100を使用すると、時間は1ずつ増加し、40は分に使用されます。
Mihai Crăiță 2014

155

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


3
setTimeは、日付オブジェクトではなく、ミリ秒のタイムスタンプを返します。(ワンライナーを作成できるとは思わないでください。)
アランH.

12
var in30Mins = new Date(+new Date() + 1.8e6)ワンライナーですが、ツーライナーよりも優れているかどうかはわかりません。;-)
RobG 2017年

112

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


9
これの複製を投稿したことに気づきました。代わりに削除して+1しました。
Izzy

3
この質問の最も簡単な答え
vijay

setMinutesタイムスタンプを返すと思いますnowが、Dateオブジェクトのままなのでnow = new Date(now)、廃止されます
p.boiko

46

たぶんこんな感じ?

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

console.log(v)


6
@ Chacha102:2つのDateオブジェクトは必要ありません。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
グラントワグナー

12
彼は2つの日付オブジェクトが必要でした。質問を読んでください。別の日付オブジェクトより30分進んでいる1つの日付オブジェクト。
タイラーカーター

5
これは1時間を過ぎてもループしても問題ありませんか?それで、11:59に電話した場合、12:29に問題なくスケジュールされますか?
Chris Rae

1
@ChrisRaeはい、そうです。If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo

35

私は常に7つの関数を作成し、JSで日付を操作します:addSeconds、addMinutes、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;
        };

誰でもこのアプローチの問題を見ることができますか?
Dembinski、2016年

1
代わりにmoment.jsを使用してください
Victor Pudeyev 2016年

@ TheDembinski—どのような問題が予想されますか?ビルトインの拡張は一般に嫌われていますが、日付に関する問題は見当たりません。各メジャー増分がオプションでマイナー増分も(set *メソッドのように)設定するとよいので、addHoursはオプションで分、秒、ミリ秒を要したdate.addHours(3, 30)ため、3時間30分を追加できます。addYearsには年、月、日がかかり、addMonthsには月、日がかかり、addMinutesには分、秒、ミリ秒などがかかります
RobG

1
こんにちは@transformerこのようなnew Date().addHours(4).addMinutes(45);ことをします。メソッドは現在の日付オブジェクトである「this」を返すため、好きなだけ呼び出すことができます。
ヤコビ

1
:@transformerこんにちは、あなたは元、あなたが望む任意の順序で使用することができ、私は確かに私はあなたの問題を理解してないんだけど、これらは、プロトタイプの関数である var dt = new Date();、その後dt.addMinutes(45); dt.addHours(4);、さらにdt.addMinutes(285);あるいはまた、dt.addMinutes(45).addHours(4);すべての動作します。コード例について質問がある場合は、問題をここに投稿してください。喜んでお手伝いします。
Jacobi

13

解決する最も簡単な方法は、JavaScriptで日付が単なる数値であることを認識することです。はじまる0'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)。すべて1がミリ秒を表します。値を取得し、その値を使用して新しい日付をインスタンス化することにより、ミリ秒を加算または減算できます。あなたはその心でそれをかなり簡単に管理することができます。

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)

10

これは私がかなりうまくいくように見えることです:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

次に、これを次のように呼び出すだけです。

var now = new Date();
console.log(now.addMinutes(50));

2
あなたはただ行うことができますreturn new Date(this.getTime() + minutes * 60000);、私は暫定のコピーされた日付は必要ありません。;-)
RobG 2017年

5

ここでES6のバージョンは:

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

次のように呼び出します:

getTimeAfter30Mins();

ユーザーに4:30時間+ 2:15時間/分を入力させていますが、ユーザーに時間と分を渡し、それを既存の時間の分に追加するにはどうすればよいですか。
変圧器

@transformerを使用すると、数値の検証を行う時間、分などのさまざまな入力フィールドを指定できます。
xameeramir 2017

5

ここでの答えの多くには創造的な要素が欠けており、タイムトラベルの計算に非常に必要とされています。私は30分の一時的な翻訳のための私のソリューションを提示します。

(jsfiddleはこちら

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}

これはクリエイティブだと認めざるを得ません。しかし、男..これは読みにくいです!
エリックバーン2017年

2

私のような怠惰な人のために:

「enum」を使用し、同じオブジェクトを操作する、Kipの回答(上記から)をcoffeescriptで:

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

2

時間の計算に関係する問題を処理することが知られている既存のライブラリを使用します。私の現在のお気に入りは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>

3
理由なしに反対票を投じても、回答は向上しません。
Ouroborus

OPは、フレームワーク/ライブラリではなく、JavaScriptソリューションを要求しました。
mattpark22

2
@ mattpark22私はあなたが何を手に入れているのか理解していますが、JavaScriptライブラリはまだJavaScriptです。ライブラリの関連部分だけを取り除いて、コードソリューションとして提示することができました。OPは、あなたがそれを意味するという意味でjavascriptである答えを持っていますが、(おそらく)受け入れ可能な汎用のソリューションを認識していません。また、Dateオブジェクトでは処理されない多くのエッジケースがあるため、30分を追加することは、ほとんどの回答が意味をなすほど簡単ではありません。たとえば、DSTの境界を越えると、最も一般的な回答が壊れます。
Ouroborus

@Ouroborus — OPがOPまたはタグ内のライブラリを要求していない場合、ライブラリは唯一のソリューションではありません。そうでない場合、回答はさまざまなライブラリで何かを実行するための非常に多くの方法になる可能性があり、OPは実際の問題(この場合、解決するのはかなり簡単です)に対しては賢明ではありません。
RobG 2017年

1
@RobGライブラリソリューションのみを提供する必要があることを示唆する人はいません。OPは、ライブラリーを具体的に要求することはできません。ライブラリーを要求すると、問題がトピックから外れるためです。「JavaScriptを使用するにはどうすればよいですか?」特に、この詳細がタイトルとタグで繰り返されている場合、これがJavaScriptに固有であることを指定する(生のコードソリューションを要求するのではなく、特定の言語でソリューションを要求する)と解釈できます。
ウロボロス2017年

1

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

DP_DateExtensionsライブラリ

これがあなたが必要とするすべての日付処理であるならば、それはやり過ぎですが、それはあなたが望むことをします。

日付/時刻のフォーマット、日付の計算(日付の部分の追加/減算)、日付の比較、日付の解析などをサポートします。これは自由にオープンソースです。


1

あなたはこれを行うことができます:

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to milliseconds
let date1 = new Date();
let date2 = new Date(date1.getTime() + thirtyMinutes);
console.log(date1);
console.log(date2);



1

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


0

トピックが古すぎることは知っています。しかし、まだこれを必要とする開発者がいると確信しているので、この簡単なスクリプトを作成しました。あなたが楽しんでくれることを望みます!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.