Soru JavaScript'te bir tarihe nasıl ay eklenir? [çift]


Bu sorunun zaten bir cevabı var:

JavaScript'te bir tarihe ay eklemek istiyorum.

Örneğin: Tarih ekliyorum 06/01/2011 (biçim mm/dd/yyyy) ve şimdi bu tarihe 8 ay eklemek istiyorum. Sonucun olmasını istiyorum 02/01/2012.

Aylar eklerken, yıl da artabilir.


152
2018-04-13 06:03


Menşei


06.01.2011 tarihine 8 ay ekleyecekseniz, 02/01/2011 tarihine nasıl değiştirileceğini açıklayınız. - Sai Kalyan Kumar Akshinthala
Bu, doğru olması zor bir sorundur - bir ayın 31'inde ne olur ve hedef ayın 31 günü yoksa ne olur? Daha da kötüsü, hedef ay Şubat ise? - Alnitak
@kalyan: 06.01.2011 tarihine 8 ay eklerim (mm / gg / yyyy) o zaman 02/01/2012 olacaktır çünkü eğer 06 + 08 = 14 eklersek ve sadece 12 ayımız olacak yılı değiştirin ve sonucu 02/01/2012 olarak verin. - Kanak Vaghela
@Alnitak: Hayır sevgili sadece ayın 1'inde başlayacak. - Kanak Vaghela
o zaman söylemeliydin .... - Alnitak


Cevaplar:


itibaren İşte:

var jan312009 = new Date(2009, 0, 31);
var eightMonthsFromJan312009  = jan312009.setMonth(jan312009.getMonth()+8);

158
2018-04-13 06:11



Bu bir yazım hatası değil - Date kurucusu 1 değil, Ocak için 0 kullanır. - Alnitak
Ya örneğin 8 yerine 1 eklerseniz? 31 Şubat 2009’u göstermez miydi? - Will Sampson
@Sampson. Hayır, 3 Mart 2009 gösterecek :) - Cristian Ciocău
Aydaki son günlerde bu çözümü kontrol edin;) - Szorstki
Neden yapmak zorundasın new Date üzerinde jan3120091 iki defa? İkinci çizgi olamazdı var eight.... = jan312009.setMonth(jan312009.getMonth()+8);? - Kolob Canyon


Tarihinizi yıl, ay ve gün bileşenlerine ayırın ve ardından kullanın tarih:

var d = new Date(year, month, day);
d.setMonth(d.getMonth() + 8);

Tarih, yılı düzeltmekle ilgilenecek.


144
2018-04-13 06:13



Dikkatli - Bu, çoğu ayın 31'inci gününe ekleme gibi kenar durumlarında çalışmaz. Örneğin, bu yöntemi kullanarak 31 Eki 2011 + 1 ay, Javascript'in standart Date nesnesini kullanarak 1 Aralık 2011'dir. jsfiddle.net/KyleMit/jLbbk27v - KyleMit
@KyleMit Ne beklediğinize bağlıdır. - xehpuk
@ xehpuk, evet, elbette, ama bu değil Çoğu insanın bekleyeceği şey. 1 ay eklerseniz, ayın ekim ayından aralık ayına geçmesine şaşırırdım. 10 + 1 != 12... eğer 31 gün katmaktan bahsediyorsam, eminim ki, bu sadece gelecekte 31 gün olmalı. Her iki durumda da, kullanım durumunuza uygun şekilde kullanın, ancak yine de kenar kasalarını not edin - KyleMit


Ben datejs bir göz attı ve bir tarih işleme kenar vakalarına ay eklemek için gerekli kodu çıkardı (artık yıl, daha kısa aylar, vb):

Date.isLeapYear = function (year) { 
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
};

Date.getDaysInMonth = function (year, month) {
    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};

Date.prototype.isLeapYear = function () { 
    return Date.isLeapYear(this.getFullYear()); 
};

Date.prototype.getDaysInMonth = function () { 
    return Date.getDaysInMonth(this.getFullYear(), this.getMonth());
};

Date.prototype.addMonths = function (value) {
    var n = this.getDate();
    this.setDate(1);
    this.setMonth(this.getMonth() + value);
    this.setDate(Math.min(n, this.getDaysInMonth()));
    return this;
};

Bu, "addMonths ()" işlevini, kenar durumlarını ele alması gereken herhangi bir javascript tarih nesnesine ekler. Coolite Inc'e teşekkürler!

kullanın:

var myDate = new Date("01/31/2012");
var result1 = myDate.addMonths(1);

var myDate2 = new Date("01/31/2011");
var result2 = myDate2.addMonths(1);

- >> newDate.addMonths -> mydate.addMonths

result1 = "29 Şub 2012"

result2 = "28 Şubat 2011"


71
2017-11-29 19:58



benim günümü kurtardı :-) - chris
Bu örneğin düşünen tek çözüm: 31 Eki 2011 + 1? - chris
IMHO ayındaki günlerin daha kolay bulunmasının yeni bir tarih olduğuna dair geri dönüş tarihi (yıl, ay + 1, 0) .getDate (); Yani isLeapYear () için gereken de düşer. Ayrıca Prototip-Olmayan Yöntemlere olan ihtiyacı da ortadan kaldırmaz. - Daniel
İlginç Daniel, bir önceki ay için 0 gün koyabilirsiniz. - Jazaret
Bu çözümle ilgili bir sorun var: jsfiddle.net/nikoudel/mdzaddeh İlk tarihin "2011-03-11T00: 00: 00Z" olduğunu ve yerel saat diliminin Helsinki olduğunu (GMT + 2) varsayalım. Altı ay eklendiğinde, gün ışığından yararlanma saati nedeniyle bir saat kaybolacak: Sat, 10 Eyl 2011 23:00:00 GMT. - Nikolai Koudelia


Bir göz atmayı şiddetle tavsiye ederim datejs. Bu api ile, bir ay (ve diğer birçok tarih işlevselliği) eklemek için ölü basit düşüyor:

var one_month_from_your_date = your_date_object.add(1).month();

Ne güzel datejs kenar durumlarını ele almasıdır, çünkü teknik olarak bunu yerel kullanarak yapabilirsiniz Date nesne ve ekli yöntemler. Ama sonunda saçlarını kenarlarından çekiyorsun. datejs senin için halledildi.

Ayrıca açık kaynak!


12
2018-04-13 06:09