JavaScript Date nesnesine saat mi ekliyorsunuz?


399

JavaScript'in Date nesnesinin herhangi bir tür ekleme işlevi uygulamadığı beni şaşırtıyor.

Sadece bunu yapabilen bir işlev istiyorum:

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

function Date.prototype.addHours(h) {

   // how do I implement this?  

}

Sadece bir yönde bazı işaretçiler istiyorum.

  • Dize ayrıştırma yapmam gerekir mi?

  • SetTime'ı kullanabilir miyim?

  • Milisaniyeye ne dersiniz?

Bunun gibi:

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

Bu gerçekten acayip görünüyor - ve hatta çalışıyor mu?

Yanıtlar:


423

JavaScript'in kendisi korkunç Tarih / Saat API'larına sahiptir. Bununla birlikte, bunu saf JavaScript'te yapabilirsiniz:

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

Tıkır tıkır çalışıyor! Teşekkür ederim
moreirapontocom

eğer diyelim ki ertesi güne yuvarlanmasına neden olan bir saat ekliyorsanız, bu onu yakalar ve her şeyi düzgün bir şekilde artırır mı (gün ay yılı)?
cdoern

@cdoern Bence, çünkü getTime () milisaniye dönecek ve buna daha fazla milisaniye ekleyeceksiniz
The1993

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

Ölçek:

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

25
Bunun işe yaradığını düşünmüyorum --- 23 saatlik bir şeyle test et, mesela? Jason Harwig'in cevabı benim için aklıma geldi.
Domenic

11
Javascript'te bir nesne prototipine şeyler eklemek kötü bir uygulamadır ve Domenic doğrudur, bu işe yaramaz. Jason Harwig'in aşağıdaki çözümü daha iyi.
iKode

19
@Domenic Bu, Firefox 10, Chrome 21 ve IE 8/9 JavaScript konsolunda test edilen 23:00 ile iyi çalışıyor Burada test etmek için kullandığım kod: 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 () ile de iyi çalışıyor
tanguy_k

4
Bu çözümle ilgili sorunlara rastladım - DST değişim noktasında benim için 1'lik artış başarısız oldu (bir saat ileri git).
andrewb

2
Ayrıca bu tarafından ısırıldı - setHours (getHours-1) kullanarak saatlerce döngü oldu: şimdi, ilk DST saat, bu sonsuz bir döngü olur. Yani sonucu kontrol edin!
cfstras

165

Aşağıdaki kod bugüne 4 saat eklemek içindir (bugünün tarihi örneği)

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

4 ila 23 eklemeye çalışırsanız hataya neden olmaz ( dokümanlara bakın ):

Belirttiğiniz bir parametre beklenen aralığın dışındaysa, setHours () işlevi Date nesnesindeki tarih bilgilerini buna göre güncellemeye çalışır.


Bunu görmedim ve yinelenen bir cevap verdim. Bu yöntemi seviyorum. Hassas ve kullanışlı.
Beyaz Gandalf

Bu saatler ondalık (tamsayı değil) olduğunda işe yaramıyor
gregmagdits

3
Buradaki en iyi cevap budur ... Date prototipine "addHours" eklemek endişe vericidir, çünkü bir noktada JS bu işlev için destek ekleyebilir ve sonra çakışan bir prototipiniz vardır. Bu size neredeyse çok fazla kod kullanma işlevselliği sağlar.
Kris Boyd

şaşırttı, ama aslında günleri, ayları gerekiyorsa
artırıyor

4
> 23 saat değerlerini kullanmak bunu kırmazken, yine de gün ışığından yararlanma sınırlarında kırılır . Kırıldığı göz önüne alındığında, onu kullanmanın bir nedeni yoktur; tercih setTimeveya setUTCHour.
Mark Amery

40

Date nesnesinin bir parametresini değiştirerek değil, bir kopyasını döndürerek addHours yöntemini değiştirilemez hale getirmek daha iyidir.

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

Bu şekilde, durum hakkında endişelenmeden bir grup yöntem çağrısını zincirleyebilirsiniz.


Bu işlev burada belirtildiği gibi aynı sorunlara sahiptir stackoverflow.com/questions/1050720/… Bu, belirli tarayıcılarda çalışıp çalışmadığı ile ilgili değildir, ancak Javascript kullanan diğer yerler bunu bir sorun olarak görür. çözümünüzü bu çözümle
taramak

1
Sözcük add*genellikle nesnenin kendisini mutasyona uğratmak için kullanıldığından işlev adını değiştirmeyi düşünmelisiniz .
mr5

@ mr5 - bundan emin değilim add, .NET framework DateTimesınıfında çok kullanılır ve Math'daki +(artı) ile aynı anlama sahiptir .
Tahir Hassan

1
currentDate.addHours(1)<- Programlama içgüdümden, currentDatedeğerin değişmesini bekliyorum , ama uygulamanızda değişmeyecek. Neden bir şeyi yeniden adlandırmayı veya imzasını değiştirmeyi öneriyorum
mr5

1
@TahirHassan, teknik ayrıntılar ile ilgisi yoktur, ancak işlev adı için kullanılacak doğru sözcüğü seçmektir. İşlevin ön add
eki

23

Kennedy tarafından önerilen sürüm, ayarlanan saat numarası olduğu için DST'ye veya DST'den değiştirilirken başarısız olacaktır.

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

zaman sistemi özelliklerinden bağımsız olarak hsaatler ekleyecektir this. Jason Harwig'in yöntemi de işe yarıyor.


19

Momentjs http://momentjs.com/ Library ' yi kullanabilirsiniz .

var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();

7

Ayrıca orijinal nesnenin değiştirilmemesi gerektiğini düşünüyorum. Gelecekteki işgücünü kurtarmak için, Jason Harwig ve Tahir Hasan'ın cevaplarına dayanan birleşik bir çözüm :

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


4

Önceden tanımlanmamış olup olmadığını kontrol edin, aksi takdirde Tarih prototipinde tanımlar:

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

3

Bunu işlemenin başka bir yolu, tarihi unixtime'a (epoch) dönüştürmek, ardından eşdeğeri (mili) saniye olarak eklemek ve sonra geri dönüştürmektir. Bu şekilde, ertesi gün 01:00 ile sonuçlanması gereken 21'e 4 saat eklemek gibi gün ve ay geçişlerini gerçekleştirebilirsiniz.


Haklısın - ama aynı zamanda birkaç yıl geç kaldın. Jason Harwig'in cevabı sizden 2 yıl önce bu yöntemi gösterdi; bu cevap yeni bir şey eklemiyor.
Mark Amery

3

Javascript'te basit bir saat / dakika ekleme / çıkarma işlevi için şunu deneyin:

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);
};

Bu, geçerli saati almak için parametre olmadan kullanılabilir

getTime();

veya eklenen dakika / saat ile zamanı almak için parametrelerle

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

negatif zaman bile işe yarar

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

bu işlev bir dizi döndürür

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

Bir fonksiyonun bu 56-çizgi canavarı , en çok oy alan cevapta iki-hatlı yaklaşıma göre ne gibi bir avantaj sağlar ? -1 çünkü burada görebileceğim hiçbir fayda olmadan çok büyük bir karmaşıklık var.
Mark Amery

1

SPRBRN doğrudur. Ayın ve yılın başlangıcını / yılını hesaba katmak için Epoch'a ve geriye dönmeniz gerekir.

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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


veya tek satırda yapın (burada değişken adları yukarıdakiyle aynıdır:

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

0

Bu, artırılmış veya azaltılmış veri değeri elde etmenin kolay bir yoludur.

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

Biraz dağınık, ama işe yarıyor!

Bunun gibi bir tarih biçimi verildi: 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+"");

Çıktınız şöyle olur: 2019-04-03T16: 58

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.