JavaScript Dateオブジェクトに時間を追加しますか?


400

JavaScriptのDateオブジェクトがいかなる種類の追加機能も実装していないことに驚かされます。

私は単にこれを行うことができる関数が欲しいです:

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // how do I implement this?  

}

方向を示すポインタをいくつかお願いします。

  • 文字列解析を行う必要がありますか?

  • setTimeを使用できますか?

  • ミリ秒はどうですか?

このような:

new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)?  

これは本当にハックに見えます-そしてそれはうまくいきますか?

回答:


424

JavaScript自体はひどい日付/時間APIを持っています。それでも、純粋なJavaScriptでこれを行うことができます。

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h*60*60*1000));
  return this;
}

魅力的な作品!ありがとう
moreirapontocom

1時間を追加して翌日にロールオーバーすると言った場合、これはそれをキャッチしてすべてを適切に増分しますか(日月年)?
cdoern

@cdoern getTime()はミリ秒を返し、それにミリ秒を追加するだけなので、そうなると思います
The1993

370
Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

テスト:

alert(new Date().addHours(4));

25
私はこれがうまくいくとは思いません---例えば23時間の何かでそれをテストしますか?ジェイソン・ハーウィッグの答えは私に思いついたものです。
Domenic

11
Javascriptでオブジェクトプロトタイプに何かを追加することは悪い習慣であり、Domenicは正しいですが、これは機能しません。以下のJason Harwigのソリューションの方が優れています。
iKode

19
@Domenicこれは23:00で正常に動作し、Firefox 10、Chrome 21、IE 8/9のJavaScriptコンソール内でテストされました。ここでテストに使用したコード: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) setMinutes()
でも正常に動作します

4
このソリューションの問題に遭遇しました-DST切り替えポイントで、1の増分が失敗しました(時計を1時間進める)。
andrewb 2015年

2
これにも噛まれました-私はsetHours(getHours-1)を使用して何時間もループしていました:今、最初の夏時間では、これは無限ループになります。だから、結果をチェックしてください!
cfstras 2016年

165

以下のコードは、日付に4時間を追加するものです(今日の日付の例)

var today = new Date();
today.setHours(today.getHours() + 4);

23に4を追加してもエラーにはなりません(ドキュメントを参照)。

指定したパラメーターが予期された範囲外の場合、setHours()はそれに応じてDateオブジェクトの日付情報を更新しようとします


私はこれを見ていないので、同じ答えを出しました。私はこの方法が好きです。正確で便利です。
ガンダルフホワイト

時間が10進数(整数ではない)の場合、これは機能しないようです
gregmagdits

3
これがここでの最良の答えです。Dateプロトタイプに「addHours」を追加するのは厄介です。ある時点でJSがその関数のサポートを追加し、プロトタイプが競合する可能性があるためです。これにより、ほぼ同じ量のコードを使用して機能を利用できます。
クリスボイド

驚いたが、実際には数日、必要に応じて数か月、ドキュメントへのリンクが役立つ
2oppin

4
23より大きい時間値を使用してもこれは問題ありませんが、夏時間の境界では問題ありません。壊れていることを考えると、それを使用する理由はありません。setTimeまたはを好むsetUTCHour
マークアメリー

40

パラメータを変更するのではなく、Dateオブジェクトのコピーを返すことにより、addHoursメソッドを不変にすることをお勧めします。

Date.prototype.addHours= function(h){
    var copiedDate = new Date(this.getTime());
    copiedDate.setHours(copiedDate.getHours()+h);
    return copiedDate;
}

これにより、状態を気にすることなく、一連のメソッド呼び出しを連鎖させることができます。


この関数には、ここに記載されているものと同じ問題があります。stackoverflow.com/ questions / 1050720 /…これは、特定のブラウザーで機能するかどうかということではありませんが、JavaScriptを使用する他の場所ではこれを問題と見なしています。この1つの stackoverflow.com/a/1050782/295535を使用してソリューションを
組み合わせる

1
この単語add*は一般的にオブジェクト自体を変更するために使用されるため、関数名の変更を検討する必要があります。
mr5

@ mr5-よくわかりません。.NET addフレームワークDateTimeクラスでよく使用され、+Mathの(プラス)と同じ意味です。
Tahir Hassan

1
currentDate.addHours(1)<-私のプログラミングの本能から、私はcurrentDate値が変わることを期待していますが、あなたの実装では、そうではありません。署名の名前を変更するか、署名を変更することをお勧めする理由について
mr5

1
@TahirHassanは技術的な詳細とは何の関係もありませんが、関数名に使用する適切な単語を選択します。関数のプレフィックスが付いている場合でも、可変バージョンを好むadd
mr5

23

設定されているのは時間数であるため、kennebecによって提案されたバージョンは、DSTとの間で変更するときに失敗します。

this.setUTCHours(this.getUTCHours()+h);

時間システムの特性に関係なく、h時間を追加しthisます。Jason Harwigの方法も同様に機能します。



7

また、元のオブジェクトは変更しないでください。したがって、将来の人材を節約するために、Jason HarwigTahir Hasanの回答に基づいた統合ソリューションを次に示します。

Date.prototype.addHours= function(h){
    var copiedDate = new Date();
    copiedDate.setTime(this.getTime() + (h*60*60*1000)); 
    return copiedDate;
}


4

まだ定義されていないかどうかを確認します。それ以外の場合は、Dateプロトタイプで定義します。

if (!Date.prototype.addHours) {
    Date.prototype.addHours = function(h) {
        this.setHours(this.getHours() + h);
        return this;
    };
}

3

これを処理する別の方法は、日付をunixtime(エポック)に変換し、次に(ミリ秒)秒に相当する値を追加して、元に戻すことです。このようにして、21に4時間を追加するなど、翌日01:00になるように、日と月の遷移を処理できます。


あなたは正しいですが、あなたも数年遅れています。Jason Harwigの回答は、この方法を2年前に示しました。この答えは何も新しいものを追加しません。
マークアメリー

3

JavaScriptで単純な時間/分を加算/減算するために、これを試してください:

function getTime (addHour, addMin){
    addHour = (addHour?addHour:0);
    addMin = (addMin?addMin:0);
    var time = new Date(new Date().getTime());
    var AM = true;
    var ndble = 0;
    var hours, newHour, overHour, newMin, overMin;
    //change form 24 to 12 hour clock
    if(time.getHours() >= 13){
        hours = time.getHours() - 12;
        AM = (hours>=12?true:false);
    }else{
        hours = time.getHours();
        AM = (hours>=12?false:true);
    }
    //get the current minutes
    var minutes = time.getMinutes();
    // set minute
    if((minutes+addMin) >= 60 || (minutes+addMin)<0){
        overMin = (minutes+addMin)%60;
        overHour = Math.floor((minutes+addMin-Math.abs(overMin))/60);
        if(overMin<0){
            overMin = overMin+60;
            overHour = overHour-Math.floor(overMin/60);
        }
        newMin = String((overMin<10?'0':'')+overMin);
        addHour = addHour+overHour;
    }else{
        newMin = minutes+addMin;
        newMin = String((newMin<10?'0':'')+newMin);
    }
    //set hour
    if(( hours+addHour>=13 )||( hours+addHour<=0 )){
        overHour = (hours+addHour)%12;
        ndble = Math.floor(Math.abs((hours+addHour)/12));
        if(overHour<=0){
            newHour = overHour+12;
            if(overHour == 0){
                ndble++;
            }
        }else{
            if(overHour ==0 ){
                newHour = 12;
                ndble++;
            }else{
                ndble++;
                newHour = overHour;
            }
        }
        newHour = (newHour<10?'0':'')+String(newHour);
        AM = ((ndble+1)%2===0)?AM:!AM;
    }else{
        AM = (hours+addHour==12?!AM:AM);
        newHour = String((Number(hours)+addHour<10?'0':'')+(hours+addHour));
    }
    var am = (AM)?'AM':'PM';
    return new Array(newHour, newMin, am);
};

これは現在の時刻を取得するためにパラメーターなしで使用できます

getTime();

または追加された分/時間で時間を取得するためのパラメーター付き

getTime(1,30); // adds 1.5 hours to current time
getTime(2);    // adds 2 hours to current time
getTime(0,120); // same as above

負の時間でも機能します

getTime(-1, -30); // subtracts 1.5 hours from current time

この関数は、

array([Hour], [Minute], [Meridian])

関数のこの56行のモンスターは、トップ投票の回答で2行のアプローチよりもどのような利点がありますか?-1わかりませんが、ここには非常に複雑なため、わかりません。
マークアメリー

1

SPRBRNは正しいです。月と年の初め/終わりを説明するために、エポックに変換して戻す必要があります。

その方法は次のとおりです。

var milliseconds = 0;          //amount of time from current date/time
var sec = 0;                   //(+): future
var min = 0;                   //(-): past
var hours = 2;
var days = 0;

var startDate = new Date();     //start date in local time (we'll use current time as an example)

var time = startDate.getTime(); //convert to milliseconds since epoch

//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24)

var newDate = new Date(newTime);//convert back to date; in this example: 2 hours from right now


または、1行で実行します(変数名は上記と同じです:

var newDate = 
    new Date(startDate.getTime() + millisecond + 
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));

0

これは、インクリメントまたはデクリメントされたデータ値を取得する簡単な方法です。

const date = new Date()
const inc = 1000 * 60 * 60 // an hour
const dec = (1000 * 60 * 60) * -1 // an hour

const _date = new Date(date)
return new Date( _date.getTime() + inc )
return new Date( _date.getTime() + dec )

-1

少し面倒ですが、うまくいきます!

次のような日付形式の場合:2019-04-03T15:58

  //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];

  //Split the hours and minutes.
  var timearray = time.split(":");

  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

あなたの出力は次のようになります:2019-04-03T16:58

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