Bagaimana cara menghitung tanggal dalam JavaScript tiga bulan sebelum hari ini?


147

Saya mencoba untuk membentuk tanggal 3 bulan sebelum tanggal saat ini. Saya mendapatkan bulan ini dengan kode di bawah ini

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

Bisakah kalian memberi saya logika untuk menghitung dan membentuk tanggal (objek dari Datetipe data) mengingat bahwa ketika bulan Januari (1), 3 bulan sebelum tanggal akan menjadi OCtober (10)?

Jawaban:


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

Ini berfungsi untuk Januari. Jalankan cuplikan ini:

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


Ada beberapa peringatan ...

Sebulan adalah hal yang aneh. Bagaimana Anda mendefinisikan 1 bulan? 30 hari? Kebanyakan orang akan mengatakan bahwa satu bulan yang lalu berarti hari yang sama bulan pada bulan sebelumnya rujukan . Tetapi lebih dari separuh waktu, yaitu 31 hari yang lalu, bukan 30. Dan jika hari ini adalah tanggal 31 di bulan itu (dan ini bukan Agustus atau Decemeber), hari di bulan itu tidak ada di bulan sebelumnya.

Menariknya, Google setuju dengan JavaScript jika Anda bertanya hari apa satu bulan sebelum hari lain :

Hasil pencarian Google untuk 'satu bulan sebelum 31 Maret' menunjukkan '3 Maret'

Ia juga mengatakan bahwa satu bulan adalah 30,4167 hari : Hasil pencarian Google untuk 'satu bulan dalam satu hari' menunjukkan '30 .4167 '

Jadi, apakah satu bulan sebelum 31 Maret adalah hari yang sama dengan satu bulan sebelum 28 Maret, 3 hari sebelumnya? Ini semua tergantung pada apa yang Anda maksud dengan "satu bulan sebelumnya". Pergi mengobrol dengan pemilik produk Anda.

Jika Anda ingin melakukan seperti saat ini, dan memperbaiki kesalahan hari terakhir bulan ini dengan pindah ke hari terakhir bulan itu, Anda dapat melakukan sesuatu seperti ini:

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

Jika persyaratan Anda lebih rumit dari itu, gunakan matematika dan tulis beberapa kode. Anda seorang pengembang! Anda tidak perlu menginstal perpustakaan! Anda tidak perlu menyalin dan menempel dari stackoverflow! Anda dapat mengembangkan kode sendiri untuk melakukan tepat apa yang Anda butuhkan!


var currentDate = Tanggal baru (); var currentMonth = currentDate.getMonth () -12; var pastDate = Tanggal baru (2011, currentMonth, 01); alert (pastDate); ini berhasil, diperiksa dengan 12 bulan
KeenUser

Ini adalah jawaban yang sakit ... Dari mana saya akan mendapatkan 2012,0,15? Konversi bulan yang ada -1?
Alex G

3
@AlexG - Jika Anda baru parsing tanggal JavaScript, maka saya dapat melihat bagaimana contoh cepat saya akan membingungkan. JavaScript menyatakan bulan sebagai berbasis nol, di mana Januari adalah nol. Untuk menghindari kebingungan seperti itu, terutama karena itu tidak ada hubungannya dengan pertanyaan atau jawaban saya, saya telah memperbarui demo saya untuk mendapatkan tanggal dari sebuah string, yang seharusnya lebih intuitif.
gilly3

7
Saya tahu ini sudah lama tetapi jika tanggal 31 Maret dan Anda mengurangi satu bulan menggunakan metode ini hasilnya adalah 2 Maret. jsfiddle.net/atamata/rvumf7dg
atamata

@atamata - Ya, itu aneh, tetapi dapat diprediksi dan diharapkan. 31 hari setelah akhir bulan sebelumnya untuk Maret adalah 31 Maret, tetapi untuk Februari itu 2 Maret. Jika Anda ingin menghitung dari akhir bulan, Anda harus menulis beberapa kode khusus untuk itu.
gilly3

28

Saya sarankan menggunakan perpustakaan yang disebut Moment.js.

Ini diuji dengan baik, berfungsi lintas browser dan di sisi server (saya menggunakannya baik dalam proyek Angular dan Node). Ini memiliki dukungan besar untuk tanggal lokal.

http://momentjs.com/

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

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

.format()mengembalikan representasi string tanggal yang diformat dalam format ISO 8601 . Anda juga dapat menggunakannya dengan format tanggal khusus seperti ini:.format('dddd, MMMM Do YYYY, h:mm:ss a')


10

"Satu liner" (pada banyak baris agar mudah dibaca)) untuk dimasukkan langsung ke dalam variabel:

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

bagus! Tidak yakin apakah itu berlaku untuk setiap skenario, tetapi tampaknya berfungsi cukup baik.
Devin Fields

8

Untuk membuat semuanya menjadi sangat sederhana, Anda dapat menggunakan DateJS, perpustakaan tanggal untuk JavaScript:

http://www.datejs.com/

Kode contoh untuk Anda:

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

8

Ini harus menangani penjumlahan / pengurangan, cukup masukkan nilai negatif untuk dikurangi dan nilai positif untuk ditambahkan. Ini juga memecahkan masalah crossover bulan.

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

Jika setMonthmetode yang ditawarkan oleh gilly3 bukan yang Anda cari, pertimbangkan:

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".

Dapat digunakan untuk jumlah waktu berapa pun, cukup atur kelipatan yang tepat.


Saya akan pergi dengan jawaban gilly3. Anda mengasumsikan jumlah detik tetap per bulan. Aritmatika tanggal lenient JavaScript akan menjaga hari tetap benar. TIGA bulan sebelum 28 September seharusnya 28 Juli.
Ray Toal

1
Saya ingin tahu apa yang akan dihitung JavaScript pada 31 Maret dikurangi 1 bulan.
Niet the Dark Absol

1
Dalam hal ini Anda mendapatkan 3 Maret (untuk 2011) karena itulah yang 31 Februari dalam mode ringan. Tetapi kurangi 2 bulan dan Anda akan mendapatkan 31 Januari. Di bawah model 28-hari per bulan Anda tidak akan. Selemah Datekelas, dan sebanyak Date.js lebih disukai, itu pada model setidaknya kalender proleptic lunak yang cukup baik untuk digunakan kasual.
Ray Toal

Bukankah lebih dari 1000 detik hingga 1000 setTime()?
Vlad Tsepelev

4

Saya suka kesederhanaan jawaban gilly3 , tetapi pengguna mungkin akan terkejut bahwa sebulan sebelum 31 Maret adalah 3 Maret. Saya memilih untuk mengimplementasikan versi yang menempel pada akhir bulan, jadi sebulan sebelum 28 Maret, 29, 30, dan 31 semuanya akan menjadi 28 Februari saat itu bukan tahun kabisat.

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

Sudah ada jawaban yang elegan tetapi saya merasa sulit untuk membaca sehingga saya membuat fungsi saya sendiri. Untuk tujuan saya, saya tidak memerlukan hasil negatif tetapi tidak akan sulit untuk memodifikasi.

    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

Ini adalah kode terkecil dan termudah.

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

Menyatakan variabel yang memiliki tanggal saat ini. kemudian hanya dengan menggunakan fungsi inbuilt setMonth kita bisa mendapatkan tanggal kembali 3 bulan.


-1

Dalam kasus saya, saya perlu mengurangi 1 bulan ke tanggal saat ini. Bagian yang penting adalah angka bulan, jadi tidak peduli di hari mana bulan ini Anda berada, saya perlu bulan lalu. Ini kode saya:

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)

Kurangi 1 bulan ke tanggal sebenarnya itu tidak akurat, itu sebabnya di tempat pertama saya atur hari pertama bulan itu (hari pertama setiap bulan selalu adalah hari pertama) dan di tempat kedua saya kurangi 1 hari, yang selalu mengirim Anda ke bulan lalu. Semoga bisa membantu Anda bung.

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

Lulus objek Tanggal JS dan bilangan bulat berapa bulan yang ingin Anda tambahkan / kurangi. monthsToAddbisa positif atau negatif. Mengembalikan objek tanggal JS.

Jika Anda originalDateObject31 Maret, dan Anda lulus -1 sebagai monthsToAdd, maka tanggal output Anda akan 28 Februari.

Jika Anda melewati sejumlah besar bulan, katakanlah 36, itu akan menangani penyesuaian tahun dengan benar.

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>

Bagaimana jawaban ini berbeda dari 7 lainnya, jawaban yang sudah cukup lama, sudah ada?
Stephen Rauch

-5

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.