Bagaimana cara mendapatkan perbedaan antara dua Tanggal di JavaScript?

111

Saya membuat aplikasi yang memungkinkan Anda menentukan acara dengan kerangka waktu. Saya ingin mengisi tanggal akhir secara otomatis ketika pengguna memilih atau mengubah tanggal mulai. Namun, saya tidak tahu bagaimana cara mendapatkan perbedaan antara dua waktu, dan kemudian bagaimana membuat Tanggal akhir baru menggunakan perbedaan itu.

bdukes
sumber

Jawaban:

73

Dalam JavaScript, tanggal dapat diubah menjadi jumlah milidetik sejak epoc dengan memanggil getTime()metode atau hanya menggunakan tanggal dalam ekspresi numerik.

Jadi untuk mendapatkan perbedaannya, kurangi saja kedua tanggal tersebut.

Untuk membuat tanggal baru berdasarkan perbedaannya, cukup teruskan jumlah milidetik di konstruktor.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

Ini seharusnya bekerja

EDIT : Memperbaiki bug yang ditunjukkan oleh @bdukes

EDIT :

Untuk penjelasan dari perilaku, oldBegin, oldEnd, dan newBeginadalah Datecontoh. Memanggil operator +dan -akan memicu transmisi otomatis Javascript dan secara otomatis akan memanggil valueOf()metode prototipe dari objek tersebut. Kebetulan valueOf()metode tersebut diimplementasikan dalam Dateobjek sebagai panggilan ke getTime().

Jadi pada dasarnya: date.getTime() === date.valueOf() === (0 + date) === (+date)

Vincent Robert
sumber
Apa format yang diperlukan agar .getTime () berfungsi ... Misalnya - Tanggal baru ('22 -12-2012 00:00 '). GetTime () tidak akan berfungsi ... Ada ide?
Jimmyt1988
1
Untuk penguraian tanggal di JS, saya sarankan Anda melihat pertanyaan ini: stackoverflow.com/questions/1576753/…
Vincent Robert
8
Apakah OldBegin, oldEnd, dan NewBegin seharusnya menjadi Dateobjek? Sulit untuk mengatakan jenis objek apa mereka seharusnya, karena deklarasi variabel dihilangkan di sini.
Anderson Green
Selain itu, ada fungsi yang dapat Anda gunakan untuk menambah atau mengurangi tanggal di JavaScript: stackoverflow.com/a/1214753/975097
Anderson Green
Berhati-hatilah saat menambahkan angka dan hari. Lihat jawaban saya di bawah untuk penjelasannya
Dan
24

JavaScript dengan sempurna mendukung perbedaan tanggal di luar kotak

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

Sekarang beberapa jebakan. Coba ini:

console.log(a - 10);
console.log(a + 10);

Jadi, jika Anda berisiko menambahkan angka dan Tanggal, ubah Tanggal menjadi numbersecara langsung.

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

Contoh tinju saya mendemonstrasikan kekuatan objek Date tetapi sebenarnya itu tampak seperti bom waktu

Dan
sumber
Dan, menurut saya teladan Anda paling mudah dipahami dan diikuti. Terima kasih.
Melanie
5
"Perangkap" sebenarnya adalah default berdasarkan spesifikasi bahasa. Operator pengurangan -memaksa argumen menjadi angka, sehingga Tanggal mengembalikan nilai waktunya. The +operator kelebihan beban, sehingga mungkin melakukan itu, pemaksaan untuk nomor atau Rangkaian. Karena Tanggal memaksa ke String dalam kasus ini, +melakukan penggabungan. Kebingungan bukanlah kesalahan dari objek Date, tetapi karena operator yang kelebihan beban.
RobG
9

Lihat JsFiddle DEMO

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

untuk Kode HTML Anda:

<div id="showTime"></div>
tika
sumber
4

Jika Anda tidak peduli dengan komponen waktu, Anda dapat menggunakan .getDate()dan .setDate()hanya mengatur bagian tanggal.

Jadi untuk menetapkan tanggal akhir Anda menjadi 2 minggu setelah tanggal mulai Anda, lakukan sesuatu seperti ini:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

Untuk mengembalikan perbedaan (dalam hari) antara dua tanggal, lakukan ini:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

Akhirnya, mari kita ubah fungsi pertama sehingga bisa mengambil nilai yang dikembalikan oleh 2nd sebagai parameter:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}
Joel Coehoorn
sumber
31
GetDateDiff()akan menembus batas bulan. Misalnya, 2011/04/26 dan 2011/05/01 akan menghasilkan -25, tetapi offsetnya harus 5 hari.
nfm
var ds = new Date (2014, 0, 31, 0, 0, 0, 0); var de = new Date (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) mengembalikan 0
Noor
3

Terima kasih @ Vincent Robert , saya akhirnya menggunakan contoh dasar Anda, meskipun sebenarnya newBegin + oldEnd - oldBegin. Inilah solusi akhir yang disederhanakan:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }
bdukes
sumber
1
Ini poin yang bagus untuk menjelaskan mengapa Anda terkadang menggunakan getTimedan terkadang tidak
Dan
2

Bergantung pada kebutuhan Anda, fungsi ini akan menghitung selisih antara 2 hari, dan mengembalikan hasil dalam desimal hari.

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}
sparkyspider
sumber
1
Lakukan Math.abs()panggilan, dan Anda akan selalu mendapatkan desimal positif.
Koen.
1
Saran bagus Koen. Itu memberi orang 2 pilihan: hanya perbedaan tanggal sebenarnya seperti yang Anda sarankan, atau dateiff dengan tanda yang menunjukkan apakah perbedaannya di masa lalu atau masa depan. :)
sparkyspider
Harap dicatat bahwa dalam JavaScript Anda juga dapat menambahkan / mengurangi angka dalam milidetik date.getTime()untuk mendapatkan waktu di masa depan / masa lalu. `var nextMinute = Tanggal baru (someDate.getTime () + 60 * 1000);
Dan
Ini salah ketik? "antara 2 hari". Mungkin antara 2 tanggal.
tomazahlin
2

Jika menggunakan moment.js, ada solusi yang lebih sederhana, yang akan memberi Anda perbedaan hari dalam satu baris kode.

moment(endDate).diff(moment(beginDate), 'days');

Detail tambahan dapat ditemukan di halaman moment.js

Selamat, Miguel

Miguel Guardo
sumber
1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}
dheerendra
sumber
1

modifikasi alternatif kode diperpanjang ..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}
NovaYear
sumber
Tambahkan klarifikasi lebih lanjut pada jawaban Anda dan gunakan bahasa Inggris yang lebih baik.
Dana Gugatan Monica
Solusi ini salah karena Anda menggunakan 365 hari, mengabaikan tahun kabisat.
Sergey Goliney
0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}
hiren gamit
sumber
0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>
Sukanya Suku
sumber
0

kode ini mengisi durasi tahun studi ketika Anda memasukkan tanggal mulai dan tanggal akhir (memenuhi syarat tanggal yang dijamin) studi dan memeriksa apakah durasi kurang dari setahun jika ya peringatan pesan ingat ada tiga elemen masukan yang pertama txtFromQualifDatedan kedua txtQualifDatedan ketigatxtStudyYears

itu akan menunjukkan hasil dari jumlah tahun dengan pecahan

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }
shareef
sumber
1
Jangan pernah mengurai string tanggal untuk menemukan tahun karena kemunculan string (khususnya pemisah) berbeda di antara browser. Gunakan getFullYearyang dirancang untuk itu. ------- Lihat pustaka datejs di googlecode yang mungkin mendukung sebagian besar kasus pojok
Dan
terima kasih atas saran @Dan tetapi itu berhasil dan diuji untuk saya pada proyek pemerintah nyata (browser yang berbeda) apakah itu praktif pemrograman yang lemah? :)
shareef
0

Jika Anda menggunakan objek Tanggal dan kemudian menggunakan getTime()fungsi untuk kedua tanggal itu akan memberi Anda waktu masing-masing sejak Jan 1, 1970 dalam nilai angka. Anda kemudian bisa mendapatkan selisih antara angka-angka ini.

Jika itu tidak membantu Anda, lihat dokumentasi lengkapnya: http://www.w3schools.com/jsref/jsref_obj_date.asp

Aaron
sumber
Oh, ya, tidak memperhatikan, jawaban di bawah ini paling lama berusia setengah tahun.
Koen.
0

Kode di bawah ini akan mengembalikan hari yang tersisa dari hari ini ke tanggal berjangka.

Dependensi: jQuery dan MomentJs.

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');
Vin S
sumber
0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);
Vin S
sumber
0

INI ADALAH YANG SAYA LAKUKAN PADA SISTEM SAYA.

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
Sean Cortez
sumber