Perbedaan dalam Bulan antara dua tanggal di JavaScript

143

Bagaimana cara mengetahui perbedaan untuk dua objek Date () di JavaScript, sementara hanya mengembalikan jumlah bulan dalam perbedaannya?

Bantuan apa pun akan sangat bagus :)

williamtroup.dll
sumber
Sebulan bukanlah satuan pengukuran yang sangat akurat karena panjang bulan berubah bergantung pada bulan itu. Jika interval berlangsung 30 hari antara Januari dan Februari, itu kurang dari 1 bulan jika Anda berpikir dalam 31 hari dalam sebulan, tetapi lebih dari 1 bulan jika Anda mempertimbangkan 28 atau 29 hari Februari.
Mark Byers
7
Pertanyaan yang tidak terlalu jelas. Apakah 28 Feb 23:58 sampai 1 Maret 00:01 satu bulan? Atau hanya satu hari? Atau hanya tiga menit? Atau ketiganya?
Thilo
1
@Thilo Seseorang yang perlu menerapkan ini mungkin tidak akan memiliki jawaban, karena manajer mereka tidak tahu apa yang mereka tanyakan sejak awal. :)
AlbertEngelB

Jawaban:

239

Definisi "jumlah bulan dalam perbedaan" memiliki banyak interpretasi. :-)

Anda bisa mendapatkan tahun, bulan, dan hari dalam sebulan dari objek tanggal JavaScript. Bergantung pada informasi apa yang Anda cari, Anda dapat menggunakannya untuk mengetahui berapa bulan di antara dua titik waktu.

Misalnya, off-the-cuff:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

(Perhatikan bahwa nilai bulan dalam JavaScript dimulai dengan 0 = Januari.)

Memasukkan pecahan bulan di atas jauh lebih rumit, karena tiga hari di bulan Februari yang khas adalah pecahan yang lebih besar dari bulan itu (~ 10.714%) daripada tiga hari di bulan Agustus (~ 9.677%), dan tentu saja bahkan Februari adalah target yang bergerak. tergantung pada apakah itu tahun kabisat.

Ada juga beberapa pustaka tanggal dan waktu yang tersedia untuk JavaScript yang mungkin membuat hal semacam ini lebih mudah.


Catatan : Dulu ada + 1di atas, di sini:

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

Itu karena awalnya saya berkata:

... ini untuk mengetahui berapa bulan penuh yang berada di antara dua tanggal, tidak termasuk bulan parsial (misalnya, tidak termasuk bulan setiap tanggal dalam).

Saya telah menghapusnya karena dua alasan:

  1. Tidak menghitung bulan parsial ternyata tidak menjadi apa yang diinginkan banyak (kebanyakan?) Orang yang datang ke jawaban, jadi saya pikir saya harus memisahkan mereka.

  2. Itu tidak selalu berhasil bahkan dengan definisi itu. :-D (Maaf.)

TJ Crowder
sumber
91

Jika Anda tidak mempertimbangkan hari dalam sebulan, ini adalah solusi yang jauh lebih sederhana

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

Ketahuilah bahwa indeks bulan berbasis 0. Ini berarti January = 0dan December = 11.

Tom Gullen
sumber
11
Ini adalah kode terpendek dan termudah yang pernah saya lihat sejauh ini!
Omar
Tidak ada yang rumit dengan yang satu ini kecuali fakta bahwa setiap bulan mulai dihitung. 31/03/2011 -> 01/05/2011 akan menjadi dua bulan serta 01/03/2011 -> 31/05/2011 tetapi harus tiga bulan tepatnya.
Natim
Jika Anda hanya ingin tahu berapa bulan yang ini SEMPURNA !!!!! Jika Anda perlu tahu berdasarkan hari dalam sebulan ini tidak akan berhasil.
OSDM
1
Mulai dari fakta bahwa 2018/01 dan 2017/01 berjarak 12 bulan. Bekerja mundur dari sana. Jawaban ini mengerti. ;)
Gerard ONeill
1
Terima kasih! Fungsi ini sangat membantu saya
Trương Long
30

Kadang-kadang Anda mungkin ingin mendapatkan jumlah bulan di antara dua tanggal yang sama sekali mengabaikan bagian hari. Jadi misalnya, jika Anda memiliki dua tanggal- 2013/06/21 dan 2013/10 / 18- dan Anda hanya peduli tentang bagian 2013/06 dan 2013/10, berikut adalah skenario dan kemungkinan solusi:

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1.Jika Anda hanya menginginkan jumlah bulan antara dua tanggal tidak termasuk bulan1 dan bulan2

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2. Jika Anda ingin memasukkan salah satu bulan

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3. Jika Anda ingin memasukkan kedua bulan tersebut

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;
Mikayil Abdullayev
sumber
Bagus! Bekerja sempurna untuk saya.
3
Untuk yang terakhir, saya akan merekomendasikan: numberOfMonths=(year2-year1)*12+(month2-month1)+1;mana yang melakukan hal yang sama tetapi lebih semantik benar bagi saya
Natim
Ya, pendekatan yang bagus dan lebih elegan.
Mikayil Abdullayev
Ini adalah jawaban terbaik. Terima kasih!
marienke
Ini sederhana dan bersih. Terima kasih telah menulis kode yang bagus.
nol-dan-satu
28

Berikut adalah fungsi yang secara akurat memberikan jumlah bulan antara 2 tanggal.
Perilaku default hanya menghitung bulan penuh, misalnya 3 bulan dan 1 hari akan menghasilkan perbedaan 3 bulan. Anda dapat mencegah hal ini dengan mengatur roundUpFractionalMonthsparam sebagai true, sehingga perbedaan 3 bulan dan 1 hari akan dikembalikan sebagai 4 bulan.

Jawaban yang diterima di atas (jawaban TJ Crowder) tidak akurat, terkadang mengembalikan nilai yang salah.

Misalnya, monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))pengembalian 0yang jelas-jelas salah. Perbedaan yang benar adalah 1 bulan penuh atau 2 bulan pembulatan.

Inilah fungsi yang saya tulis:

function getMonthsBetween(date1,date2,roundUpFractionalMonths)
{
    //Months will be calculated between start and end dates.
    //Make sure start date is less than end date.
    //But remember if the difference should be negative.
    var startDate=date1;
    var endDate=date2;
    var inverse=false;
    if(date1>date2)
    {
        startDate=date2;
        endDate=date1;
        inverse=true;
    }

    //Calculate the differences between the start and end dates
    var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
    var monthsDifference=endDate.getMonth()-startDate.getMonth();
    var daysDifference=endDate.getDate()-startDate.getDate();

    var monthCorrection=0;
    //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
    //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
    if(roundUpFractionalMonths===true && daysDifference>0)
    {
        monthCorrection=1;
    }
    //If the day difference between the 2 months is negative, the last month is not a whole month.
    else if(roundUpFractionalMonths!==true && daysDifference<0)
    {
        monthCorrection=-1;
    }

    return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
};
Francisc
sumber
6
Serius, siapa yang menolak ini? Dia benar, jawaban yang diterima hanya ... salah.
Michael Blackburn
2
Ini adalah jawaban yang paling cocok.
Kalyan Chavali
Ini tidak benar jika katakanlah tanggal1 adalah 22 Januari, dan tanggal2 adalah 22 Agustus. Kemudian mengembalikan 7, yang jelas harus 8?
Nicolai Harbo
buatlah jawaban yang diterima ini. Ini lebih akurat daripada yang diterima. Untuk Contoh jawaban yang diterima tidak menghitung hari
Munkhdelger Tumenbayar
Jawaban yang diterima Crowder telah diperbarui. Mungkin masih ada perbedaan penting antara itu dan jawaban ini, tetapi, pada tulisan ini, masalah yang tercantum di sini telah diatasi.
clozach
23

Jika Anda perlu menghitung bulan penuh, terlepas dari bulan itu 28, 29, 30, atau 31 hari. Di bawah ini harus bekerja.

var months = to.getMonth() - from.getMonth() 
    + (12 * (to.getFullYear() - from.getFullYear()));

if(to.getDate() < from.getDate()){
    months--;
}
return months;

Ini adalah versi tambahan dari jawaban https://stackoverflow.com/a/4312956/1987208 tetapi memperbaiki kasus ketika ia menghitung 1 bulan untuk kasus dari 31 Januari hingga 1 Februari (1 hari).

Ini akan mencakup hal-hal berikut;

  • 1 Jan hingga 31 Jan ---> 30 hari ---> akan menghasilkan 0 (logis karena ini bukan sebulan penuh)
  • 1 Feb hingga 1 Mar ---> 28 atau 29 hari ---> akan menghasilkan 1 (logis karena sebulan penuh)
  • 15 Feb hingga 15 Mar ---> 28 atau 29 hari ---> akan menghasilkan 1 (logis sejak sebulan berlalu)
  • 31 Januari - 1 Feb ---> 1 hari ---> akan menghasilkan 0 (jelas tetapi jawaban yang disebutkan dalam hasil posting dalam 1 bulan)
harun
sumber
2
Itulah yang saya pikir saya datang ke sini untuk verifikasi dan itulah satu-satunya jawaban yang masuk akal bagi saya
Andreas
2
Ini tidak berhasil jika membandingkan dua bulan dengan bulan yang lebih pendek. Misalnya, dari 31 Maret hingga 30 April. Itu semua di bulan April, jadi jawabannya adalah "1."
Michael Blackburn
7

Perbedaan dalam Bulan antara dua tanggal di JavaScript:

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

total bulan antara start_date dan end_date:

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())

sumber
6

Saya tahu ini sangat terlambat, tetapi tetap mempostingnya kalau-kalau itu membantu orang lain. Ini adalah fungsi yang saya buat yang tampaknya melakukan pekerjaan yang baik dalam menghitung perbedaan bulan antara dua tanggal. Memang jauh lebih cabul daripada Mr. Crowder, tetapi memberikan hasil yang lebih akurat dengan menelusuri objek tanggal. Ini ada di AS3 tetapi Anda seharusnya bisa melepaskan pengetikan yang kuat dan Anda akan memiliki JS. Jangan ragu untuk membuatnya lebih bagus dengan melihat siapa pun di luar sana!

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) { 
            stepDate.month += 1;
            monthCount += 1;
        }           

        if ( stepDate != endDate ) { 
            monthCount -= 1;
        }

        return monthCount;
    }
James
sumber
Ini adalah pendekatan yang paling tepat untuk sebagian besar situasi. Ada begitu banyak pengecualian dan ketidakteraturan dalam kalender kami, pendekatan terbaik adalah mendelegasikan penanganannya ke perpustakaan yang teruji dengan baik, seperti Date (). Untuk sebagian besar rentang (pendek), ini akan mengembalikan jawaban yang sama seperti pendekatan yang dihitung, tetapi ketika Anda berurusan dengan rentang waktu yang panjang (termasuk tahun kabisat, tahun kabisat-tahun-yang-bukan-tahun kabisat, kabisat- detik, dll.) Anda lebih cenderung mengalami pengecualian di mana mengurangi bulan dan menambahkan tahun akan menjadi salah. Lihat jawaban saya untuk pengecualian saat perhitungan akan menjadi yang terbaik.
Michael Blackburn
5

Untuk memperluas jawaban @ TJ, jika Anda mencari bulan sederhana, daripada bulan kalender penuh, Anda bisa memeriksa apakah tanggal d2 lebih besar dari atau sama dengan dari d1. Artinya, jika d2 lebih lambat pada bulannya dari pada d1 pada bulannya, maka ada 1 bulan lagi. Jadi, Anda seharusnya bisa melakukan ini:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    // edit: increment months if d2 comes later in its month than d1 in its month
    if (d2.getDate() >= d1.getDate())
        months++
    // end edit
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10

Ini tidak sepenuhnya memperhitungkan masalah waktu (mis. 3 Maret pukul 16:00 dan 3 April pada pukul 15:00), tetapi lebih akurat dan hanya untuk beberapa baris kode.

calvin
sumber
5

Pertimbangkan setiap tanggal dalam satuan bulan, lalu kurangi untuk menemukan perbedaannya.

var past_date = new Date('11/1/2014');
var current_date = new Date();

var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());

Ini akan memberi Anda perbedaan bulan antara kedua tanggal tersebut, mengabaikan hari.

internet-nico
sumber
5

Anda juga dapat mempertimbangkan solusi ini, ini functionmengembalikan perbedaan bulan dalam bilangan bulat atau angka

Meneruskan tanggal mulai sebagai yang pertama atau terakhir param, adalah toleransi kesalahan. Artinya, fungsinya masih akan mengembalikan nilai yang sama.

const diffInMonths = (end, start) => {
   var timeDiff = Math.abs(end.getTime() - start.getTime());
   return Math.round(timeDiff / (2e3 * 3600 * 365.25));
}

const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));

// shows month difference as integer/number
console.log(result);

Hamzeen Hameem
sumber
1
Anda harus mengalikan dengan 365,25 untuk memperhitungkan tahun kabisat
darryn.ten
4

Ada dua pendekatan, matematis & cepat, tetapi dapat berubah-ubah di kalender, atau berulang & lambat, tetapi menangani semua keanehan (atau setidaknya delegasi menangani mereka ke perpustakaan yang teruji dengan baik).

Jika Anda mengulang melalui kalender, menambah tanggal mulai satu bulan & melihat apakah kami melewati tanggal akhir. Ini mendelegasikan penanganan anomali ke kelas Date () bawaan, tetapi bisa lambat JIKA Anda melakukan ini untuk sejumlah besar tanggal. Jawaban James mengambil pendekatan ini. Meskipun saya tidak menyukai idenya, saya pikir ini adalah pendekatan yang "paling aman", dan jika Anda hanya melakukan satu perhitungan, perbedaan kinerja benar-benar dapat diabaikan. Kami cenderung mencoba terlalu mengoptimalkan tugas yang hanya akan dilakukan sekali.

Sekarang, jika Anda menghitung fungsi ini pada kumpulan data, Anda mungkin tidak ingin menjalankan fungsi itu di setiap baris (atau Tuhan melarang, beberapa kali per catatan). Dalam hal ini, Anda dapat menggunakan hampir semua jawaban lain di sini kecuali jawaban yang diterima, yang salah (perbedaan antara new Date()dan new Date()-1)?

Inilah tusukan saya pada pendekatan matematis dan cepat, yang menjelaskan panjang bulan dan tahun kabisat yang berbeda. Anda seharusnya hanya menggunakan fungsi seperti ini jika Anda akan menerapkan ini ke kumpulan data (melakukan perhitungan ini berulang-ulang). Jika Anda hanya perlu melakukannya sekali, gunakan pendekatan iteratif James di atas, saat Anda mendelegasikan penanganan semua (banyak) pengecualian ke objek Date ().

function diffInMonths(from, to){
    var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear()));

    if(to.getDate() < from.getDate()){
        var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate());
        if (to < newFrom  && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0){
            months--;
        }
    }

    return months;
}
Michael Blackburn
sumber
3

Di sini Anda pergi pendekatan lain dengan lebih sedikit perulangan:

calculateTotalMonthsDifference = function(firstDate, secondDate) {
        var fm = firstDate.getMonth();
        var fy = firstDate.getFullYear();
        var sm = secondDate.getMonth();
        var sy = secondDate.getFullYear();
        var months = Math.abs(((fy - sy) * 12) + fm - sm);
        var firstBefore = firstDate > secondDate;
        firstDate.setFullYear(sy);
        firstDate.setMonth(sm);
        firstBefore ? firstDate < secondDate ? months-- : "" : secondDate < firstDate ? months-- : "";
        return months;
}
ggomeze
sumber
1
berhati-hatilah terhadap metode ini: metode ini (cukup jelas bila Anda membacanya dengan cermat) mutasi tanggal pertama yang diteruskan kembali ke pemanggil (karena tanggal diteruskan dengan referensi).
Andiih
2

Hitung selisih antara dua tanggal termasuk pecahan bulan (hari).


var difference = (date2.getDate() - date1.getDate()) / 30 +
    date2.getMonth() - date1.getMonth() +
    (12 * (date2.getFullYear() - date1.getFullYear()));

Contoh:
tanggal1 : 24/09/2015 (24 Sept 2015)
tanggal2 : 09/11/2015 (9 Nov 2015)
perbedaannya: 2.5 (bulan)

Shneor
sumber
2

Ini seharusnya bekerja dengan baik:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months += d2.getMonth() - d1.getMonth();
    return months;
}
Thiago Jordan
sumber
1
function calcualteMonthYr(){
    var fromDate =new Date($('#txtDurationFrom2').val()); //date picker (text fields)
    var toDate = new Date($('#txtDurationTo2').val());

var months=0;
        months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;
        months -= fromDate.getMonth();
        months += toDate.getMonth();
            if (toDate.getDate() < fromDate.getDate()){
                months--;
            }
    $('#txtTimePeriod2').val(months);
}
shoaib fazlani
sumber
1

Kode berikut mengembalikan bulan penuh antara dua tanggal dengan memperhitungkan juga hari dari sebagian bulan.

var monthDiff = function(d1, d2) {
  if( d2 < d1 ) { 
    var dTmp = d2;
    d2 = d1;
    d1 = dTmp;
  }

  var months = (d2.getFullYear() - d1.getFullYear()) * 12;
  months -= d1.getMonth() + 1;
  months += d2.getMonth();

  if( d1.getDate() <= d2.getDate() ) months += 1;

  return months;
}

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 20))
> 1

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 19))
> 0

monthDiff(new Date(2015, 01, 20), new Date(2015, 01, 22))
> 0
Delorean
sumber
1
function monthDiff(d1, d2) {
var months, d1day, d2day, d1new, d2new, diffdate,d2month,d2year,d1maxday,d2maxday;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
months = (months <= 0 ? 0 : months);
d1day = d1.getDate();
d2day = d2.getDate();
if(d1day > d2day)
{
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d1new = new Date(d2year, d2month-1, d1day,0,0,0,0);
    var timeDiff = Math.abs(d2.getTime() - d1new.getTime());
          diffdate = Math.abs(Math.ceil(timeDiff / (1000 * 3600 * 24))); 
    d1new = new Date(d2year, d2month, 1,0,0,0,0);
    d1new.setDate(d1new.getDate()-1);
    d1maxday = d1new.getDate();
    months += diffdate / d1maxday;
}
else
{
      if(!(d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear()))
    {
        months += 1;
    }
    diffdate = d2day - d1day + 1;
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d2new = new Date(d2year, d2month + 1, 1, 0, 0, 0, 0);
    d2new.setDate(d2new.getDate()-1);
    d2maxday = d2new.getDate();
    months += diffdate / d2maxday;
}

return months;

}

Tariq
sumber
1

logika di bawah ini akan mengambil perbedaan dalam beberapa bulan

(endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())
Anoop Isaac
sumber
1
function monthDiff(date1, date2, countDays) {

  countDays = (typeof countDays !== 'undefined') ?  countDays : false;

  if (!date1 || !date2) {
    return 0;
  }

  let bigDate = date1;
  let smallDate = date2;

  if (date1 < date2) {
    bigDate = date2;
    smallDate = date1;
  }

  let monthsCount = (bigDate.getFullYear() - smallDate.getFullYear()) * 12 + (bigDate.getMonth() - smallDate.getMonth());

  if (countDays && bigDate.getDate() < smallDate.getDate()) {
    --monthsCount;
  }

  return monthsCount;
}
Abbas Siddiqi
sumber
0

Lihat apa yang saya gunakan:

function monthDiff() {
    var startdate = Date.parseExact($("#startingDate").val(), "dd/MM/yyyy");
    var enddate = Date.parseExact($("#endingDate").val(), "dd/MM/yyyy");
    var months = 0;
    while (startdate < enddate) {
        if (startdate.getMonth() === 1 && startdate.getDate() === 28) {
            months++;
            startdate.addMonths(1);
            startdate.addDays(2);
        } else {
            months++;
            startdate.addMonths(1);
        }
    }
    return months;
}
Fayez Zalloum
sumber
0

Itu juga menghitung hari dan mengubahnya dalam bulan.

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;   //calculates months between two years
    months -= d1.getMonth() + 1; 
    months += d2.getMonth();  //calculates number of complete months between two months
    day1 = 30-d1.getDate();  
    day2 = day1 + d2.getDate();
    months += parseInt(day2/30);  //calculates no of complete months lie between two dates
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2017, 8, 8), // Aug 8th, 2017    (d1)
    new Date(2017, 12, 12)  // Dec 12th, 2017   (d2)
);
//return value will be 4 months 
Gaurav Jain
sumber
Bisakah Anda menambahkan penjelasan lebih rinci tentang cara kerjanya? Ini akan membuat jawabannya lebih baik
serge1peshcoff
Apakah ada asumsi bulan memiliki 30 hari?
Ben Taliadoros
0

Jumlah Bulan Saat Hari & Waktu Tidak Penting

Dalam hal ini, saya tidak peduli dengan bulan penuh, setengah bulan, berapa lama sebulan, dll. Saya hanya perlu mengetahui jumlah bulan. Kasus dunia nyata yang relevan adalah saat laporan harus jatuh tempo setiap bulan, dan saya perlu tahu berapa banyak laporan yang seharusnya ada.

Contoh:

  • Januari = 1 bulan
  • Januari - Februari = 2 bulan
  • November - Januari = 3 bulan

Ini adalah contoh kode yang diuraikan untuk menunjukkan ke mana arah angka-angka tersebut.

Mari kita ambil 2 cap waktu yang seharusnya menghasilkan 4 bulan

  • Stempel waktu 13 November 2019: 1573621200000
  • Stempel waktu 20 Februari 2020: 1582261140000

Mungkin sedikit berbeda dengan zona waktu / waktu yang Anda tarik. Hari, menit, dan detik tidak penting dan dapat dimasukkan dalam stempel waktu, tetapi kami akan mengabaikannya dengan perhitungan aktual kami.

Langkah 1: Ubah stempel waktu menjadi tanggal JavaScript

let dateRangeStartConverted = new Date(1573621200000);
let dateRangeEndConverted = new Date(1582261140000);

Langkah 2: Dapatkan nilai integer untuk bulan / tahun

let startingMonth = dateRangeStartConverted.getMonth();
let startingYear = dateRangeStartConverted.getFullYear();
let endingMonth = dateRangeEndConverted.getMonth();
let endingYear = dateRangeEndConverted.getFullYear();

Ini memberi kita

  • Mulai bulan: 11
  • Mulai Tahun: 2019
  • Bulan akhir: 2
  • Tahun Akhir: 2020

Langkah 3: Tambahkan (12 * (endYear - startYear)) + 1ke bulan akhir.

  • Ini membuat bulan awal kami tinggal di 11
  • Ini membuat bulan akhir kita sama dengan 15 2 + (12 * (2020 - 2019)) + 1 = 15

Langkah 4: Kurangi bulan

15 - 11 = 4; kami mendapatkan hasil 4 bulan kami.

Contoh Contoh 29 Bulan

November 2019 hingga Maret 2022 adalah 29 bulan. Jika Anda memasukkan ini ke dalam spreadsheet excel, Anda akan melihat 29 baris.

  • Bulan mulai kami adalah 11
  • Bulan akhir kita adalah 40 3 + (12 * (2022-2019)) + 1

40 - 11 = 29

Matthew Rideout
sumber
0
getMonthDiff(d1, d2) {
    var year1 = dt1.getFullYear();
    var year2 = dt2.getFullYear();
    var month1 = dt1.getMonth();
    var month2 = dt2.getMonth();
    var day1 = dt1.getDate();
    var day2 = dt2.getDate();
    var months = month2 - month1;
    var years = year2 -year1
    days = day2 - day1;
    if (days < 0) {
        months -= 1;
    }
    if (months < 0) {
        months += 12;
    }
    return months + years*!2;
}
Singhak
sumber
0

Nilai apa pun dikembalikan bersama dengan nilai absolutnya.

function differenceInMonths() {
    if (firstDate > secondDate) [firstDate, secondDate] = [secondDate, firstDate];
    let diffMonths = (secondDate.getFullYear() - firstDate.getFullYear()) * 12;
    diffMonths -= firstDate.getMonth();
    diffMonths += secondDate.getMonth();
    return diffMonths;
}
 
OI
sumber
Mungkin ingin memasukkan firstDatedan secondDateke dalam parameter fungsi Anda.
Calculuswhiz
-2
anyVar = (((DisplayTo.getFullYear() * 12) + DisplayTo.getMonth()) - ((DisplayFrom.getFullYear() * 12) + DisplayFrom.getMonth()));
Aris Dela Rea
sumber
3
Meskipun potongan kode ini dapat menjadi solusinya, menyertakan penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda.
Eugene Podskal
Tidak banyak gunanya memposting jawaban yang bergantung pada fungsi yang tidak dijelaskan atau didefinisikan dalam jawaban.
RobG
-7

Salah satu pendekatannya adalah dengan menulis Java Web Service (REST / JSON) sederhana yang menggunakan pustaka JODA

http://joda-time.sourceforge.net/faq.html#datediff

untuk menghitung perbedaan antara dua tanggal dan memanggil layanan itu dari javascript.

Ini mengasumsikan back end Anda ada di Java.

Ravi Chinoy
sumber