Bir JavaScript Tarih nesnesine 30 dakika nasıl eklenir?


785

Başka bir Date nesnesinden 30 dakika sonra bir Date nesnesi almak istiyorum. JavaScript ile nasıl yapabilirim?


1
Ben js küçük bir takvim popup komut dosyası, onun Github üzerinde , belki tarih nesnesi ile nasıl müdahale görmek için kodu bakmak. Ayrıca, Javascript Kit , özellikle tarih nesnesi için harika bir js referans olarak kontrol edin .
Christian

2
Aşağıda bir varyasyon kullanan tüm yanıtlar date.setMinutes(date.getMinutes() + ...)Yaz Saati sınırlarını geçemez. Örneğin ('2014-03-09' Yaz Saati sınırı olduğu varsayılarak): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dşimdi 30 dakika öncesidir, daha geç değildir f.
Spig

1
@Spig: DST sınırında 01: 59'dan 30 dakika sonra 1:29 AM'dir. Hata yok. Eğer yazdırmak için fve d, bir diyor göreceksiniz "GMT-0500" öteki "GMT-0400" yazan (ya da zaman dilimidir neyse). Ayrıca, .getTime()her ikisini de ararsanız fve dbunun fdaha büyük d(yani daha sonra) olduğunu görürsünüz .
Kip

1
@Spig: ilginç, Firefox'ta denedi ve işe yaradı. Ben getMinutes () nasıl çalışması şartname gri bir alana düşüyor düşünüyorum. 01:89olur 02:29, ki bu sizin “ilkbaharda ilerlediğiniz” günde olmaz. Chrome olması gerektiğine karar verir 01:29, FF karar verir 03:29. "Geri çekildiğiniz" gece, her iki tarayıcı da "geri çekilme" saatini atlar ve 90 dakika ileriye atlar 02:29. İşte bazı JSFiddle demoları: "ileri geri"
Kip

1
Aşağıdaki yanıtlardan biri sorunuza cevap verdiyse, bu sitenin çalışma şekli işe yarayıp yanıtını "kabul" edersiniz, daha fazlası: Birisi sorumu yanıtladığında ne yapmalıyım? . Ama sadece sorunuz gerçekten cevaplandıysa. Değilse, soruya daha fazla ayrıntı eklemeyi düşünün.
Hoşçakal StackExchange

Yanıtlar:


951

Kütüphane Kullanma

Çok fazla tarih çalışması yapıyorsanız, Datejs veya Moment.js gibi JavaScript tarih kitaplıklarına bakmak isteyebilirsiniz . Örneğin, Moment.js ile bu sadece:

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

Vanilya Javascript

Bu kaosun cevabı gibidir , ancak bir satırda:

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

Nerede diffdan istediğiniz dakika içinde farkı oldDateObjzamanı. Olumsuz bile olabilir.

Veya tekrar kullanılabilir bir işlev olarak, bunu birden fazla yerde yapmanız gerekiyorsa:

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

Ve bu açık değilse, dakikaları çarpmamızın nedeni 60000dakikaları milisaniyeye dönüştürmektir.

Vanilya Javascript ile Dikkatli Olun. Tarihler Zor!

Yarının tarihini almak için bir tarihe 24 saat ekleyebileceğinizi düşünebilirsiniz, değil mi? Yanlış!

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

Kullanıcının gün ışığından yararlanma saatini gözlemlemesi durumunda, bir günün 24 saat olması gerekmez. Yılda bir gün sadece 23 saat, yılda bir gün 25 saat. Örneğin, Amerika Birleşik Devletleri ve Kanada'nın çoğunda, 2 Kasım 2014 gece yarısından 24 saat sonra hala 2 Kasım:

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!

Bu nedenle , yukarıda bahsedilen kütüphanelerden birini kullanmak, bununla çok fazla iş yapmanız gerektiğinde daha güvenli bir bahistir .

Aşağıda yazdığım bu fonksiyonun daha genel bir versiyonu var. Hala bir kütüphane kullanmanızı öneririm, ancak bu projeniz için aşırı / imkansız olabilir. Sözdizimi MySQL DATE_ADD işlevinden sonra modellenmiştir .

/**
 * 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;
}

Çalışma jsFiddle demosu .


14
Bu çok güçlü; Sayı negatif olsa bile herhangi bir dakika boyunca çalışır.
Wahid Bitar

3
Saniyeler için 60k yerine 1000 ile çarpın.
ashes999

2
DateAdd () işlevi harika! Ama benden bir not var - anlamsal olarak, birim "dakika", "ikinci" vb. Olmalı ve aralık tam tersi değil, miktar (2, 10, 45, ...) olmalıdır. Aksi takdirde fikir iyidir.
Vasil Popov

1
Bu yanıt ay boyunca gerçekleşen ruloları karşılayamaz, bu nedenle 31 Ocak artı bir ay, artık yıl olup olmamasına bağlı olarak 2 veya 3 Mart verir. AddMonths ve addYears bununla Jacobi'nin cevabı anlaşma işlevleri yüzden benim için, daha iyi bir yanıt.
RobG

1
@RobG İyi bir nokta. Bunun için bir düzeltme ekledim ve "mümkünse bir kütüphane kullan" noktasını daha da vurguladım.
Kip

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

114
@Jamie: İki Datenesneye ihtiyacınız yok . var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner

15
@Grant: d2 = "Bir Date nesnesi almak istiyorum" ve başka bir Date nesnesine d1 = "varsaydım
Jamie

7
@CKeene, setMinutes & getMinutes sade eski Javascript'in bir parçasıdır (datejs bir sürü başka şey sağlar).
s29

4
FYI- Yaz Saati Uygulaması sınırlarını aşabilir. JSFiddle demoları: "bahar ileri" / "geri çekilmek" (Bunun için teşekkürler @Spig)
Kip

@trevorgrayson Belirttiğiniz bir parametre beklenen aralığın dışındaysa, setMinutes () tarih bilgilerini buna göre güncellemeye çalışır. Örneğin, 100 kullanırsanız, saatler 1 ile artırılacak ve dakikalar için 40 kullanılacaktır.
Mihai Crăiță

155

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


3
Not setTimesayısal milisaniye zaman damgası, bir tarih nesnesi döndürür. (Tek astar yapabileceğinizi düşünmeyin.)
Alan H.

12
var in30Mins = new Date(+new Date() + 1.8e6)bir astarlıdır, ancak iki astardan daha iyi olduğundan emin değilsiniz. ;-)
RobG

112

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


9
Bunun bir kopyasını yayınladığımı fark ettim. Silindi ve bunun yerine + 1'ledi.
Izzy

3
Bu soru için en basit cevap
vijay

Bence setMinuteszaman damgasını döndürür, ama nesne nowkalır Date, bu yüzden now = new Date(now)eski
p.boiko

46

Belki böyle bir şey?

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

console.log(v)


6
@ Chacha102: İki Datenesneye ihtiyacınız yok . var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner

12
İki tarih objesi istiyordu. Soruyu okuyun. Bir Date nesnesinin 30 dakika ilerisindeki bir Date nesnesi.
Tyler Carter

5
Bir saat geçtikten sonra bu işe yarıyor mu? Peki, 11:59 olarak ararsam, 12:29'da tamam mı?
Chris Rae

1
@ChrisRae evet, öyle. 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

JS'de tarihle çalışmak için her zaman 7 işlev oluştururum: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Burada bir örnek görebilirsiniz: http://jsfiddle.net/tiagoajacobi/YHA8x/

Nasıl kullanılır:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

Bu işlevler:

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

Bu yaklaşımla ilgili herhangi bir sorun gören var mı?
Dembinski

1
moment.js kullanın
Victor Pudeyev

@ TheDembinski — hangi sorunları bekliyorsunuz? Yerleşik öğeleri genişletmek genellikle beğenilmez, ancak Date ile ilgili bir sorun göremiyorum. Her büyük artışın isteğe bağlı olarak küçük artışlarını da ayarlaması ( set * yöntemleri gibi) iyi olurdu , bu nedenle addHours isteğe bağlı olarak dakika, saniye ve milisaniye sürdü, böylece date.addHours(3, 30)3 saat ve 30 dakika ekleyebilirsiniz. addYears yıl, ay ve gün, addMonths ay ve gün, addMinutes dakika, saniye, milisaniye, vb.
alacaktı

1
Hi @transformer Böyle bir şey yapmak istiyorum new Date().addHours(4).addMinutes(45);İstediğiniz kadar çağırabilirsiniz, çünkü yöntemler geçerli Date Object olan "this" döndürür.
Jacobi

1
@Transformer Merhaba, eski, emin Sorununu anlamış değilim, ama bu prototip fonksiyonu, istediğiniz herhangi bir sırada kullanabilirsiniz şunlardır: var dt = new Date();o zaman dt.addMinutes(45); dt.addHours(4);, hatta dt.addMinutes(285);ya da dt.addMinutes(45).addHours(4);tüm irade işi. Bazı kod örneğiyle ilgili bir sorunuz varsa, sorununuz için buraya gönderin, size yardımcı olmaktan memnuniyet duyarız.
Jacobi

13

Çözmenin en kolay yolu, javascript tarihlerinde sadece sayılar olduğunu tanımaktır. Başlıyor 0ya da 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Her biri 1bir milisaniyeyi temsil eder. Değeri alıp bu değeri kullanarak yeni bir tarih başlatarak milisaniye ekleyebilir veya çıkarabilirsiniz. Bu zihinle oldukça kolay yönetebilirsiniz.

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

Oldukça iyi çalışıyor gibi yaptığım budur:

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

O zaman bunu şöyle diyebilirsiniz:

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

2
Yapabilirsin return new Date(this.getTime() + minutes * 60000);, ben ara kopyalandımTarih gerekli değil. ;-)
RobG

5

İşte ES6 sürümü:

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

Şöyle çağırın:

getTimeAfter30Mins();

Ben 4:30 h + 2:15 saat / dakika giren kullanıcılar var, nasıl kullanıcılar saatler ve dakikalar geçmek ve mevcut bir saat dakika eklemek izin verebilirim.
transformatör

@transformer numara girişlerine sahip saat, dakika vb. için farklı giriş alanları verebilirsiniz.
xameeramir

5

Buradaki cevapların çoğunun, zaman yolculuğu hesaplamaları için çok gerekli olan yaratıcı bir bileşenden yoksun olduğunu hissediyorum. Çözümümü 30 dakikalık geçici bir çeviri için sunuyorum.

( burada 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]());
}

Bunun yaratıcı olduğunu itiraf etmeliyim. Ama adamım ... Bunu okumak zor!
Erik Baan

2

Benim gibi tembel için:

Kip'in kahvesinde cevabı (yukarıdan), bir "enum" kullanarak ve aynı nesne üzerinde çalışıyor:

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

Zaman hesaplamaları ile ilgili tuhaflıkları ele aldığı bilinen mevcut bir kütüphaneyi kullanın. Şu anki favorim 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
Gerekçe göstermeden aşağıya oy verirseniz cevaplar gelişemez.
Ouroborus

OP bir çerçeve / kütüphane değil bir JavaScript çözümü istedi.
16:22

2
@ mattpark22 Ne aldığınızı anlasam da, javascript kütüphanesi hala javascript. Sadece kütüphanenin ilgili parçalarını söküp bir kod çözümü olarak sunabilirim. OP'nin javascript olduğunu düşündüğünüz bir cevabı olacaktır, ancak (muhtemelen) kabul edilebilir, genel amaçlı bir çözümden habersiz olacaktır. Ayrıca, 30 dakika eklemek, yanıtların çoğu ses çıkardığı kadar önemsiz değildir, çünkü Date nesnesi tarafından işlenmeyen birçok kenar durumu vardır. Örneğin, DST sınırlarını geçerken en popüler cevap kesilir.
Ouroborus

@ Ouroborus — OP, OP'de veya etiketlerinde bir kütüphane istememişse, kütüphaneler sağlanan tek çözüm olmamalıdır. Aksi takdirde, cevaplar sadece farklı kütüphanelerde bir şeyler yapmanın yollarının bir parçası olabilir ve OP, asıl sorunlarına daha akılda bırakılmaz (bu durumda çözülmesi oldukça önemsizdir).
RobG

1
@RobG Hiç kimse sadece kütüphane çözümlerinin sağlanmasını önermiyor. OP, sorunun konu dışı olmasına neden olacağı için özellikle bir kütüphane isteyemez. "JavaScript ile nasıl yaparım?" özellikle başlıkta ve etiketlerde bu detayın tekrarlandığı göz önüne alındığında, bunun javascript'e (ham kod çözümü istemek yerine belirli bir dilde bir çözüm isteme) özgü olduğu belirtilebilir.
Ouroborus

1

Yazdığım sadece başka bir seçenek:

DP_DateExtensions Kütüphanesi

Bu, ihtiyacınız olan tüm tarih işlemesi ise aşırıya kaçıyor, ancak istediğinizi yapacak.

Tarih / saat biçimlendirme, tarih matematik (tarih bölümlerini ekleme / çıkarma), tarih karşılaştırma, tarih ayrıştırma, vb destekler.


1

Bunu yapabilirsin:

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) ile tarihi almak ve ona (30 * 60 * 1000) eklemek için geçerli tarihin değerini almalısınız. Şimdi ms ile (şu anki tarih + 30 dak) var

console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))


0

Konunun çok eski olduğunu biliyorum. Ama hala buna ihtiyaç duyan bazı geliştiriciler olduğundan eminim, bu yüzden bu basit senaryoyu sizin için yaptım. Beğenmenizi ümit ederim!

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>

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.