Bugünden üç ay önce JavaScript'teki tarihi nasıl hesaplarım?


156

Mevcut tarihten 3 ay önce bir tarih oluşturmaya çalışıyorum. İçinde bulunduğum ayı aşağıdaki koddan alıyorum

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

DateAyın Ocak (1) olduğu zaman 3 ay öncesinin Ekim (10) olacağını göz önünde bulundurarak bana bir tarih hesaplama ve oluşturma mantığını ( veri türünün bir nesnesi ) sağlayabilir misiniz?

Yanıtlar:


341
var d = new Date();
d.setMonth(d.getMonth() - 3);

Bu Ocak için geçerli. Bu pasajı çalıştırın:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());


Bazı uyarılar var ...

Bir ay tuhaf bir şeydir. 1 ayı nasıl tanımlıyorsunuz? 30 gün? Çoğu kişi, bir ay öncesinin, bir önceki ayın ihtiyaç duyulan ayın aynı günü anlamına geldiğini söyleyecektir . Ancak zamanın yarısından fazlası, yani 30 gün değil, 31 gün önce. Ve eğer bugün ayın 31'iyse (ve Ağustos ya da Aralık değil), ayın o günü önceki ay yok.

İlginç bir şekilde, Google, başka bir günden bir ay önce hangi gün olduğunu sorarsanız JavaScript'i kabul eder :

'31 Mart'tan bir ay önce' için Google arama sonucu '3 Mart'ı gösteriyor

Ayrıca bir ayın 30.4167 gün uzunluğunda olduğunu söylüyor : 'Günde bir ay' için Google arama sonucu '30 .4167 'gösteriyor

Öyleyse, 31 Mart'tan bir ay önce, 28 Mart'tan önceki bir ay ile 3 gün önce aynı gün mü? Bu, "bir ay önce" derken ne demek istediğine bağlı. Ürün sahibinizle konuşun.

Momentjs'in yaptığı gibi yapmak ve bu ayın son günü hatalarını ayın son gününe geçerek düzeltmek istiyorsanız, şöyle bir şey yapabilirsiniz:

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

Gereksinimleriniz bundan daha karmaşıksa, biraz matematik kullanın ve biraz kod yazın. Sen bir geliştiricisin! Bir kütüphane kurmanıza gerek yok! Stackoverflow'dan kopyalayıp yapıştırmanız gerekmez! İhtiyacınız olanı tam olarak yapmak için kodu kendiniz geliştirebilirsiniz!


var currentDate = new Date (); var currentMonth = currentDate.getMonth () -12; var pastDate = new Date (2011, currentMonth, 01); uyarı (pastDate); bu işe yaradı, 12 ay ile kontrol edildi
KeenUser

Bu hasta bir cevap ... 2012,0,15'i nereden alacağım? Mevcut bir -1 ayı dönüştürülsün mü?
Alex G

3
@AlexG - JavaScript tarih ayrıştırma konusunda yeniyseniz, hızlı örneğimin ne kadar kafa karıştırıcı olacağını görebilirim. JavaScript, ayları sıfır tabanlı olarak ifade eder, burada Ocak sıfırdır. Böyle bir karışıklığı önlemek için, özellikle bunun soru veya cevabımla hiçbir ilgisi olmadığından, demomu bir dizeden tarihi alacak şekilde güncelledim, bu daha sezgisel olmalı.
gilly3

7
Bunun eski olduğunu biliyorum ama tarih 31 Mart ise ve bu yöntemi kullanarak bir ay çıkarırsanız sonuç 2 Mart olur. jsfiddle.net/atamata/rvumf7dg
atamata

@atamata - Evet, bu garip, ancak tahmin edilebilir ve bekleniyor. Mart için bir önceki ayın bitiminden 31 gün sonra 31 Mart, Şubat için ise 2 Mart. Ayın sonundan itibaren saymak istiyorsanız, bunun için bazı özel kodlar yazmanız gerekir.
gilly3

29

Moment.js adlı bir kitaplık kullanmanızı tavsiye ederim.

İyi test edilmiş, tarayıcılar arası ve sunucu tarafında çalışıyor (hem Angular hem de Node projelerinde kullanıyorum). Yerel tarihler için büyük desteği vardır.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()ISO 8601 biçiminde biçimlendirilmiş tarihin dize gösterimini döndürür . Ayrıca, aşağıdaki gibi özel tarih formatıyla da kullanabilirsiniz:.format('dddd, MMMM Do YYYY, h:mm:ss a')


13

Doğrudan bir değişkene konulacak "tek satırlık" (kolay okunması için birçok satırda):

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

Güzel! Her senaryo için geçerli olup olmadığından emin değilim, ancak yeterince iyi çalışıyor gibi görünüyor.
Devin Fields

8

İşleri gerçekten basitleştirmek için JavaScript için bir tarih kitaplığı olan DateJS'yi kullanabilirsiniz:

http://www.datejs.com/

Sizin için örnek kod:

Date.today().add({ months: -1 });

8

Bu, toplama / çıkarmayı ele almalıdır, sadece çıkarmak için negatif bir değer ve eklemek için pozitif bir değer koyun. Bu aynı zamanda ay geçişi sorununu da çözer.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

6

Eğer setMonthgilly3 tarafından sunulan yöntem değildir aradığınız budur, göz önünde bulundurun:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

Herhangi bir süre için kullanılabilir, sadece doğru katları ayarlayın.


Ben gilly3'ün cevabıyla giderdim. Sizinki, ayda sabit bir saniye sayısını varsayar. JavaScript'in esnek tarih aritmetiği günü doğru tutacaktır. 28 Eylül'den üç ay önce 28 Temmuz olmalı.
Ray Toal

1
Merak ediyorum JavaScript 31 Mart eksi 1 ay olarak hesaplayacak.
Niet the Dark Absol

1
Bu durumda 3 Mart'ı (2011 için) alıyorsunuz çünkü 31 Şubat hoşgörülü modda. Ama 2 ay çıkarırsanız 31 Ocak elde edersiniz. Ayda 28 gün modeline göre yapamazsınız. DateSınıf ne kadar zayıf olursa olsun ve Date.js ne kadar tercih edilirse edilsin, en azından gündelik kullanım için yeterince iyi olan esnek bir proleptik takvimi modeller.
Ray Toal

Doğru bir şekilde 1000 saniyeye kadar birkaç saniyeniz olması gerekmez mi setTime()?
Vlad Tsepelev

4

Gilly3'ün cevabının basitliğini seviyorum , ancak kullanıcılar muhtemelen 31 Mart'tan bir ay önce 3 Mart'a şaşıracaklar. Ayın sonuna yapışan bir sürümü uygulamayı seçtim, yani 28, 29, 30 Mart'tan bir ay önce, ve artık yıl olmadığında 31'in tamamı 28 Şubat olacaktır.

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');


2

Zaten güzel bir cevap var ama okumayı zor buluyorum bu yüzden kendi işlevimi yaptım. Amacım için olumsuz bir sonuca ihtiyacım yoktu ama değiştirmek zor olmazdı.

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }

2

var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());


1

Bu en küçük ve en kolay koddur.

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

Güncel tarihi olan değişken bildiriniz. daha sonra setMonth dahili fonksiyonunu kullanarak 3 aylık geri tarih alabiliriz.


-1

Benim durumumda şimdiki tarihe 1 ay çıkarmam gerekiyordu. Önemli olan ay numarasıydı, bu yüzden içinde bulunduğun ayın hangi gününde olduğun umurunda değil, geçen ay ihtiyacım vardı. Bu benim kodum:

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

1 ayı fiili tarihe çıkarmak doğru değil, bu yüzden ilk etapta ayın ilk gününü belirledim (herhangi bir ayın ilk günü her zaman ilk gündür) ve ikinci olarak sizi her zaman geçen aya gönderen 1 günü çıkarıyorum. Sana yardım etmeyi umuyorum dostum.

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)


-1

   

 var date=document.getElementById("date");
    var d = new Date();
   document.write(d + "<br/>");
    d.setMonth(d.getMonth() - 6);
    document.write(d);

 if(d<date)
  document.write("lesser then 6 months");
else
  document.write("greater then 6 months");


-1

Bir JS Date nesnesi ve kaç ay eklemek / çıkarmak istediğinizi belirten bir tamsayı iletin. monthsToAddolumlu veya olumsuz olabilir. Bir JS tarih nesnesi döndürür.

Eğer senin originalDateObject31 Mart olduğunu ve geçmek -1 olarak monthsToAdd, sonra çıkış tarihi 28 Şubat olacak.

Çok sayıda ayı (örneğin 36) geçerseniz, yıl ayarlamasını da doğru bir şekilde halledecektir.

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};

-5
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>

Bu yanıt, zaten mevcut olan oldukça eski 7 yanıttan nasıl farklıdır?
Stephen Rauch

-5

var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);

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.