JavaScript'te 2 tarih arasındaki farkı nasıl alırsınız?


İki tarih arasındaki farkı tam gün olarak nasıl alabilirim (günün herhangi bir kesirini istemiyorum)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

Yukarıdakini denedim ama bu işe yaramadı.

Cevap #1

İşte bir yol:

const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2 - date1);
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffTime + " milliseconds");
console.log(diffDays + " days");

Tarihi tırnak içine almamız gerektiğine dikkat edin. Kodun geri kalanı zaman farkını milisaniye cinsinden alır ve sonra gün sayısını elde etmek için böler. Tarih, mm/gg/yyyy formatını bekler.

Cevap #2

Daha doğru bir çözüm

... çünkü tarihler doğal olarak farklı gün ışığı tasarrufu ayarlamalarına sahip bölgeleri kapsayabilen saat dilimi bilgisine sahiptir

Bu soruya verilen önceki cevaplar, söz konusu iki tarihin bir yaz saati uygulaması (DST) değişimini kapsadığı durumları dikkate almıyor. DST değişiminin gerçekleştiği tarihin süresi milisaniye cinsinden != 1000*60*60*24 olacak, bu nedenle tipik hesaplama başarısız olacaktır.

Bunu, önce iki tarihi UTC'ye normalize ederek ve ardından bu iki UTC tarihi arasındaki farkı hesaplayarak aşabilirsiniz.

Şimdi, çözüm şöyle yazılabilir,

// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  const _MS_PER_DAY = 1000 * 60 * 60 * 24;
  // Discard the time and time-zone information.
  const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());

  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

// test it
const a = new Date("2017-01-01"),
    b = new Date("2017-07-25"),
    difference = dateDiffInDays(a, b);
    
console.log(difference + ' days')

Bu işe yarıyor çünkü UTC zamanı hiçbir zaman DST'yi (gün ışığından yararlanma saati) uygulamaz. Bakınız UTC, gün ışığından yararlanma saatini uygular mı?

Not: Bu cevaptaki bazı yorumları tartıştıktan sonra, bir DST (Yaz Saati Uygulaması) sınırını aşan javascript tarihleriyle ilgili sorunları anladıktan sonra, bunu çözmenin birden fazla yolu olabileceği muhtemeldir. Yukarıda verdiğim çözüm basit (ve test edilmiş) bir çözümdür. İki yeni Date nesnesi oluşturmak zorunda kalmadan basit bir aritmetik/matematik tabanlı çözümün olup olmadığını öğrenmek ilgimi çeker. Bu potansiyel olarak daha hızlı olabilir.

Cevap #3

var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24), 10); 

alert(diffDays )

Cevap #4

Birçok yol denedim ve tarih seçici kullanmanın en iyisi olduğunu gördüm, ancak tarih formatı JavaScript ile sorunlara yol açıyor....

İşte benim cevabım ve kutudan çıkar çıkmaz çalıştırılabilir.

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">

<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {

$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})

$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });

$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');

if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

Bir Keman burada görülebilir DEMO

İlgili makaleler