web-dev-qa-db-ja.com

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

他のDateオブジェクトよりも30分遅いDateオブジェクトを取得したいのですが。 JavaScriptを使ってそれを行うにはどうすればよいですか。

663
Morgan Cheng

ライブラリを使う

あなたが多くの日付の仕事をしているなら、あなたは Datejs または Moment.js のようなJavaScript日付ライブラリを調べたいと思うかもしれません。たとえば、Moment.jsでは、これは単に次のようになります。

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

バニラジャバスクリプト

これは 混沌の答え のようなものですが、一行では:

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

ここで、diffは、oldDateObjの時刻からの分単位の差です。それは否定的なことさえありえます。

あるいは、再利用可能な機能として、これを複数の場所で行う必要がある場合は、

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

Vanilla Javascriptに注意してください。日付は難しいです!

明日の日付を取得するために、日付に24時間を追加できると思うかもしれませんね。 違う!

addMinutes(myDate, 60*24); //DO NOT DO THIS

ユーザーが夏時間を観察する場合、1日は必ずしも24時間の長さではありません。一年に一日23時間しかない、一年に一日25時間です。たとえば、ほとんどの米国およびカナダでは、2014年11月2日午前0時24時間後はまだ11月2日です。

addMinutes(new Date('2014-11-02'), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

こういうわけで 前述のライブラリの1つを使うことがより安全な方法です あなたがこれでたくさんの仕事をしなければならないならば。

以下は私が書いたこの関数のより一般的なバージョンです。私はまだライブラリを使用することをお勧めしますが、それはあなたのプロジェクトにとってやり過ぎる/不可能な場合があります。構文は MySQL DATE_ADD functionの後にモデル化されています。

/**
 * 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) {
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(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デモ

829
Kip
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
206
Jamie
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
137
chaos
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
87
Teo Graca

たぶんこんな感じ?

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

私はいつも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;
        };
30
Jacobi

解決する最も簡単な方法は、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)
11
tsacodes

これは私がしていることで、かなりうまくいきます。

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));
9
Jonathan

ここでの答えの多くは、タイムトラベル計算に非常に必要とされる創造的な要素を欠いていると感じます。私は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]());
}
5
unsynchronized

これが ES6 のバージョンです。

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

ようにそれを呼ぶ:

getTimeAfter30Mins();
5
student

時間計算に対処することに関わる癖を処理することが知られている既存のライブラリを使用してください。私の現在のお気に入りは 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>
2
Ouroborus

私が書いた別の選択肢

DP_DateExtensionsライブラリ

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

日付/時刻のフォーマット、日付の計算(日付部分の追加/減算)、日付の比較、日付の解析などをサポートしています。

1
Jim Davis

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

"enum"を使用し、同じオブジェクトを操作して、コーヒースクリプトでKipの答え(上から)

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
1
Blaskovicz