Bandingkan dua tanggal dengan JavaScript

1953

Dapatkah seseorang menyarankan cara untuk membandingkan nilai dua tanggal yang lebih besar dari, kurang dari, dan tidak di masa lalu menggunakan JavaScript? Nilai akan berasal dari kotak teks.

Alex
sumber
17
Ketika datang ke DateTime dan manipulasi di JS, saya tidak melihat lebih jauh dari momentjs :)
Halceyon
47
tidak perlu menggunakan momentjs untuk membandingkan 2 tanggal. Cukup gunakan objek Date javascript murni. Periksa jawaban utama untuk detail lebih lanjut.
Lukas Liesis
Anda dapat merujuk jawaban berikut: stackoverflow.com/questions/4812152/... Periksa getDateDifference dan getDifferenceInDays jika dapat membantu.
Vikash Rajpurohit
Saya akan memberi Anda alasan untuk melihat lebih jauh dari Moment.js ( yang saya suka, TAPI ... ): Jangan gunakan untuk pengulangan loop
Saham Geek
Untuk fungsi yang berguna untuk memisahkan perbedaan waktu menjadi unit (detik, menit, jam, dll), lihat jawabannya di stackoverflow.com/questions/1968167/… . Jawaban itu sekarang juga tersedia di stackoverflow.com/a/46529159/3787376 .
Edward

Jawaban:

2285

The Tanggal objek akan melakukan apa yang Anda inginkan - membangun satu untuk setiap tanggal, kemudian membandingkannya menggunakan >, <, <=atau >=.

The ==, !=, ===, dan !==operator meminta Anda untuk menggunakan date.getTime()seperti di

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

untuk menjadi jelas hanya memeriksa persamaan langsung dengan objek tanggal tidak akan berfungsi

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Saya sarankan Anda menggunakan drop-down atau bentuk entri tanggal yang dibatasi serupa daripada kotak teks, meskipun, jangan sampai Anda menemukan diri Anda dalam neraka validasi input.

bayangan bulan
sumber
64
Bahkan metode Ace tidak gagal aman. Anda harus mengatur ulang milidetik terlebih dahulu, dan Anda bahkan mungkin ingin mengatur ulang sepanjang waktu. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Yang dikombinasikan dengan menggunakan .getTime () akan memberi Anda hasil perbandingan yang akurat
patrick
102
@ Patrick, sarankan menelepon setHours(0,0,0,0)dengan cara ini. Menghilangkan kebutuhan untuk menelepon setMinutes()dll. Juga, mengeksekusi lebih cepat.
Karl
26
menghindari == atau === untuk mendapatkan hasil yang diinginkan: jsfiddle.net/P4y5J sekarang> = anotherNow && now <= anotherNow BENAR-BENAR FYI
Jason Sebring
5
Mengapa tidak menggunakan toString()metode ini saja pada kedua tanggal dan kemudian membandingkannya dengan ==operator? Tampaknya jauh lebih mudah daripada mengatur ulang waktu dan membandingkan setelah itu, apakah ada kelemahan untuk ini?
user2019515
13
Anda juga dapat membandingkan nilai numerik tanggal Anda untuk menghindari membandingkan objek itu sendiri: date1.valueOf () == date2.valueOf ()
madprog
421

Cara termudah untuk membandingkan tanggal dalam javascript adalah dengan terlebih dahulu mengubahnya menjadi objek Date dan kemudian membandingkan objek-tanggal ini.

Di bawah ini Anda menemukan objek dengan tiga fungsi:

  • Date.compare (a, b)

    Mengembalikan nomor:

    • -1 jika a <b
    • 0 jika a = b
    • 1 jika a> b
    • NaN jika a atau b adalah tanggal ilegal
  • Date.inRange (d, mulai, akhir)

    Mengembalikan boolean atau NaN:

    • true jika d berada di antara awal dan akhir (inklusif)
    • false jika d adalah sebelum mulai atau setelah akhir .
    • NaN jika satu atau lebih dari tanggal tersebut ilegal.
  • tanggal. konversi

    Digunakan oleh fungsi lain untuk mengonversi input mereka ke objek tanggal. Inputnya bisa

    • a date -object: Input dikembalikan apa adanya.
    • sebuah array : Ditafsirkan sebagai [tahun, bulan, hari]. CATATAN bulan adalah 0-11.
    • a number : Ditafsirkan sebagai jumlah milidetik sejak 1 Jan 1970 (cap waktu)
    • a string yang : Beberapa format yang berbeda didukung, seperti "YYYY / MM / DD", "MM / DD / YYYY", "31 Jan 2009" dll
    • sebuah objek : Ditafsirkan sebagai objek dengan atribut tahun, bulan, dan tanggal. CATATAN bulan adalah 0-11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}
beberapa
sumber
11
(a > b) - (a < b)berguna untuk mengurutkan array tanggal
nktssh
@nikita Ya, dan fungsi yang mengembalikan hasil itu dapat digunakan dengan Array.prototype.sortselama semua nilai adalah tanggal yang valid. Jika mungkin ada tanggal yang tidak valid, saya sarankan menggunakan sesuatu sepertifunction ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
sekitar
4
@ nktssh — mungkin, tetapi return a - blebih sederhana dan menggantikan seluruh pernyataan pengembalian.
RobG
284

Bandingkan <dan >seperti biasa, tetapi apa pun yang melibatkan =harus menggunakan +awalan. Seperti itu:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

Semoga ini membantu!

Daniel Lidström
sumber
81
sangat lambat :) Saya lebih suka x.getTime() === y.getTime()metode, baik dibaca dan sangat cepat lihat jsperf
huysentruitw
24
The +Operator berusaha untuk mengubah ekspresi menjadi Nomor. Date.valueOf()digunakan untuk konversi (yang mengembalikan hal yang sama dengan Date.getTime().
Salman A
13
@WouterHuysentruit Keduanya sangat cepat (> 3 Jutaan OPS di peramban yang paling lambat). Gunakan metode yang menurut Anda lebih mudah dibaca
Eloims
13
Perhatikan bahwa apa pun yang melibatkan '=' harus menggunakan bagian awalan '+' dari jawaban Anda salah. <, <=, >Dan >=menggunakan algoritma yang sama ( abstrak algoritma perbandingan relasional ) di belakang layar.
Salman A
2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Terima kasih atas jawaban Anda, layanan yang saya kembangkan di tempat kerja memiliki bug mengerikan yang sulit dilacak.
Gyuhyeon Lee
157

Operator relasional < <= > >=dapat digunakan untuk membandingkan tanggal JavaScript:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Namun, operator persamaan == != === !==tidak dapat digunakan untuk membandingkan (nilai) tanggal karena :

  • Dua objek berbeda tidak pernah sama untuk perbandingan ketat atau abstrak.
  • Ekspresi yang membandingkan Objek hanya benar jika operan mereferensikan Obyek yang sama.

Anda dapat membandingkan nilai tanggal untuk persamaan menggunakan salah satu dari metode ini:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

Keduanya Date.getTime()dan Date.valueOf()mengembalikan jumlah milidetik sejak 1 Januari 1970, 00:00 UTC. Operator Numberfungsi dan unary +memanggil valueOf()metode di belakang layar.

Salman A
sumber
Apakah aman untuk mengonversi objek String ke Tanggal? Bisakah itu tidak membuang pengecualian atau memberikan hasil yang tidak dapat diandalkan? Apa yang bisa menjadi cara yang paling dapat diandalkan untuk melakukan tanggal comaring di JS? Ketika Anda mengatakan hasil yang tidak dapat diandalkan, dapatkah metode ini memberikan nilai yang berbeda / salah bahkan ketika kami yakin format tanggal tidak akan berubah -> Itu akan menjadi "Kamis, 10 Agustus 2017". Bantuan Anda di sini sangat kami hargai.
user2696258
Bisakah ini memberikan hasil yang tidak dapat diandalkan untuk nilai tanggal yang sama pada OS / browser / perangkat yang berbeda?
user2696258
1
@ user2696258 ini adalah cara paling dapat diandalkan untuk membandingkan dua objek Date . Mengubah string menjadi tanggal adalah masalah yang berbeda ... gunakan parsing pustaka tanggal atau roll solusi Anda sendiri. Thursday, 10 Aug 2017adalah format non-standar dan browser yang berbeda mungkin menguraikannya secara berbeda, atau tidak menguraikannya sama sekali. Lihat catatan di Date.parse.
Salman A
88

Sejauh ini metode termudah adalah dengan mengurangi satu tanggal dari yang lain dan membandingkan hasilnya.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);

Peter Wilkinson
sumber
68

Membandingkan tanggal di JavaScript cukup mudah ... JavaScript telah built-in sistem perbandingan untuk tanggal yang membuatnya begitu mudah untuk melakukan perbandingan ...

Cukup ikuti langkah-langkah ini untuk membandingkan nilai 2 tanggal, misalnya Anda memiliki 2 input yang masing-masing memiliki nilai Tanggal Stringdan Anda membandingkannya ...

1. Anda memiliki 2 nilai string yang Anda dapatkan dari input dan Anda ingin membandingkannya, seperti di bawah ini:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Mereka perlu Date Objectdibandingkan sebagai nilai tanggal, jadi cukup konversikan menjadi tanggal, dengan menggunakan new Date(), saya hanya menetapkan ulang untuk kesederhanaan penjelasan, tetapi Anda tetap dapat melakukannya jika Anda suka:

date1 = new Date(date1);
date2 = new Date(date2);

3. Sekarang cukup membandingkannya, menggunakan> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

bandingkan tanggal dalam javascript

Alireza
sumber
Saya menemukan bahwa sebagian besar solusi untuk membandingkan tanggal bekerja di browser apa pun. Masalah yang saya alami adalah dengan IE. Solusi ini berhasil di seluruh papan. Terima kasih Alireza!
Joshua Oglesbee
2
Itu tidak bekerja. Dan itu seharusnya tidak berhasil. Anda membandingkan objek tanggal.
maksisam
3
@maxisam Tidak, tidak bekerja karena operator perbandingan ( <, >, <=, >=) yang digunakan, benda-benda Tanggal dikonversi pertama yang unix zaman (detik), dan bekerja dengan baik. Namun ini mungkin mengarah pada kesalahan umum melakukan di date1 == date2mana memang kesalahan diperkenalkan bukan nilai tetapi contoh kesetaraan diperiksa. Untuk mencegah hal ini dan memeriksa kesetaraan dari nilai tanggal ini akan berhasil date1.valueOf() == date2.valueOf()date1+0 == date2+0
humanityANDpeace
Catatan dari MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. dan Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
AaA
35

Bandingkan hanya hari (mengabaikan komponen waktu):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

Pemakaian:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}
Mpen
sumber
ini bagus. tetapi bagaimana jika saya membandingkan hari depan atau hari sebelumnya. saya mencoba Date.prototype.nextDay = fungsi (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = fungsi (d) {mengembalikan this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } tetapi hanya akan berfungsi di bulan ini saja. bagaimana saya membandingkan bulan atau tahun
Paresh3489227
32

format apa?

Jika Anda membuat objek Tanggal Javascript , Anda bisa mengurangi mereka untuk mendapatkan perbedaan milidetik (edit: atau bandingkan saja):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true
Jason S
sumber
1
Mengurangkan adalah ide yang baik karena menghindari ==masalah perbandingan yang disebutkan di atas.
devios1
REPL JavaScript apa yang Anda gunakan?
hyde
JSDB - lihat jsdb.org - Saya jarang menggunakannya akhir-akhir ini karena Python adalah bahasa pilihan saya, tetapi masih utilitas yang bagus.
Jason S
1
@ StuartP.Bentley Saya tidak tahu, karena saya tidak menggunakan mereka. Saya menggunakan jsdb.
Jason S
ketika melewati sejumlah besar tanggal, ini tampaknya paling efisien karena tidak perlu mengkonversi dengan getTime ().
pcarvalho
16

Anda menggunakan kode ini,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

Dan juga periksa tautan ini http://www.w3schools.com/js/js_obj_date.asp

tetap lapar
sumber
3
Alasan untuk tidak merujuk ke W3Schools: w3fools.com - solusi yang bagus - apakah ini sesuai standar, dan apakah itu berfungsi di semua browser?
Mathias Lykkegaard Lorenzen
1
Lihat lebih baik Jaringan Pengembang Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Daniel Lidström
16

JAWABAN SINGKAT

Berikut adalah fungsi yang mengembalikan {boolean} jika dari dateTime> ke dateTime Demo beraksi

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Penjelasan

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

karena Anda sekarang memiliki kedua datetime dalam tipe angka, Anda dapat membandingkannya dengan operasi Perbandingan apa pun

(>, <, =,! =, ==,! ==,> = DAN <=)

Kemudian

jika Anda terbiasa dengan C#String Format Tanggal dan Waktu Kustom, perpustakaan ini harus melakukan hal yang sama persis dan membantu Anda memformat tanggal dan waktu Anda dtmFRM apakah Anda memasukkan string waktu tanggal atau format unix

Pemakaian

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

DEMO

yang harus Anda lakukan adalah melewati salah satu dari format ini yang jsdisimpan dalam file library

Mina Gabriel
sumber
Tanggal baru (dtmfrom)> = Tanggal baru (dtmto) jauh lebih lambat daripada Tanggal baru (dtmfrom) .getTime ()> = Tanggal baru (dtmto) .getTime ()
Mina Gabriel
Mungkin, tetapi perbedaannya sekitar 30 hingga 120 nanodetik (katakan 0,000000075 detik) per operasi, tergantung pada browser, jadi tidak terlalu signifikan.
RobG
16

Cara sederhana adalah,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}
MICHAEL PRABHU
sumber
14

Catatan - Bandingkan Hanya Tanggal Bagian:

Ketika kita membandingkan dua tanggal dalam javascript. Dibutuhkan jam, menit dan detik juga menjadi pertimbangan .. Jadi Jika kita hanya perlu membandingkan tanggal saja, inilah pendekatannya:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

Sekarang: if date1.valueOf()> date2.valueOf()akan bekerja seperti pesona.

Sanjeev Singh
sumber
13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

sumber
1
Apa yang mereka ketik a atau b? Tanggal? Format apa? Ini sepertinya tidak bekerja dengan saya.
Luci
5
dengan asumsi adan bmenjadi Dateobjek Anda juga dapat menggunakanreturn a*1 == b*1;
Udo G
4
@UdoG: Lebih pendek:+a == +b
mpen
13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates
Narendra Kamma
sumber
11

Untuk menambahkan kemungkinan lain ke banyak opsi yang ada, Anda dapat mencoba:

if (date1.valueOf()==date2.valueOf()) .....

... yang sepertinya bekerja untukku. Tentu saja Anda harus memastikan bahwa kedua tanggal tidak ditentukan ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

Dengan cara ini kami dapat memastikan bahwa perbandingan positif dibuat jika keduanya juga tidak ditentukan, atau ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... jika Anda lebih suka mereka tidak sama.

Paul
sumber
11

Via Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

Metode mengembalikan 1 jika dateTimeAlebih besar daridateTimeB

Metode mengembalikan 0 jika dateTimeAsama dengandateTimeB

Metode mengembalikan -1 jika dateTimeAkurang daridateTimeB

Razan Paul
sumber
3
Tidak perlu menggunakan perpustakaan eksternal seperti Moment untuk melakukan perbandingan tanggal untuk Dateobjek.
amb
Momen benar-benar diperlukan untuk kasus penggunaan saya. Terima kasih, Razan!
razorsyntax
1
mengapa Anda bahkan menggunakan <atau >operator ketika saat sudah datang dengan metode perbandingan berguna seperti .isBeforedan .isAfter, itu semua ada dalam dokumen
svarog
10

HATI-HATI WAKTU

Tanggal javascript tidak memiliki gagasan tentang zona waktu . Ini adalah momen dalam waktu (kutu sejak zamannya) dengan fungsi praktis untuk menerjemahkan ke dan dari string di zona waktu "lokal". Jika Anda ingin bekerja dengan tanggal menggunakan objek tanggal, seperti yang dilakukan semua orang di sini, Anda ingin tanggal Anda mewakili UTC tengah malam pada awal tanggal tersebut. Ini adalah konvensi umum dan perlu yang memungkinkan Anda bekerja dengan tanggal terlepas dari musim atau zona waktu pembuatannya. Jadi Anda harus sangat waspada untuk mengelola gagasan tentang zona waktu, terutama ketika Anda membuat objek Tanggal UTC tengah malam Anda.

Sebagian besar waktu, Anda ingin tanggal Anda mencerminkan zona waktu pengguna. Klik jika hari ini adalah hari ulang tahun Anda . Pengguna di NZ dan AS mengklik pada waktu yang sama dan mendapatkan tanggal yang berbeda. Dalam hal ini, lakukan ini ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Terkadang, perbandingan internasional mengalahkan akurasi lokal. Dalam hal ini, lakukan ini ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

Sekarang Anda dapat langsung membandingkan objek kencan Anda seperti yang disarankan oleh jawaban lain.

Setelah berhati-hati mengelola zona waktu saat Anda membuat, Anda juga harus memastikan untuk tidak menggunakan zona waktu saat Anda mengonversi kembali ke representasi string. Jadi Anda bisa menggunakan ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Dan benar-benar menghindari yang lainnya, terutama ...

  • getYear(), getMonth(),getDate()
bbsimonbb
sumber
8

Katakanlah Anda mendapatkan objek tanggal A dan B, dapatkan nilai waktu EPOC mereka, lalu kurangi untuk mendapatkan perbedaan dalam milidetik.

var diff = +A - +B;

Itu saja.

foobar
sumber
8

Untuk membandingkan dua tanggal, kita dapat menggunakan perpustakaan JavaScript date.js yang dapat ditemukan di: https://code.google.com/archive/p/datejs/downloads

dan gunakan Date.compare( Date date1, Date date2 )metode dan mengembalikan angka yang berarti hasil berikut:

-1 = date1 kurang dari date2.

0 = nilainya sama.

1 = date1 lebih bagus dari date2.

Salahin Rocky
sumber
8

Kurangi dua tanggal, dapatkan selisih dalam milidetik, jika Anda mendapatkannya 0pada tanggal yang sama

function areSameDate(d1, d2){
    return d1 - d2 === 0
}
Yukulélé
sumber
7

Untuk membuat tanggal dari teks gratis dalam Javascript, Anda perlu menguraikannya ke dalam objek Date ().

Anda bisa menggunakan Date.parse () yang membutuhkan percobaan teks gratis untuk mengubahnya menjadi tanggal baru tetapi jika Anda memiliki kontrol atas halaman saya akan merekomendasikan menggunakan kotak pilih HTML sebagai gantinya atau pemilih tanggal seperti kontrol kalender YUI atau jQuery UI Datepicker .

Setelah Anda berkencan seperti yang ditunjukkan orang lain, Anda dapat menggunakan aritmatika sederhana untuk mengurangi tanggal dan mengubahnya kembali menjadi beberapa hari dengan membagi angka (dalam detik) dengan jumlah detik dalam sehari (60 * 60 * 24 = 86400).

sh1mmer
sumber
6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}
vickisys
sumber
5

Versi perbaikan kode yang diposting oleh "some"

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

pemakaian:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));
Rodrigo Pinho Pereira de Souza
sumber
Agaknya sebuah adalah contoh Tanggal pada metode ini disebut. Dalam hal bisa menjadi menjadi tanggal yang tidak valid, tapi masih menjadi contoh Tanggal?
RobG
5

Jika berikut adalah format tanggal Anda, Anda dapat menggunakan kode ini:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Ini akan memeriksa apakah 20121121angkanya lebih besar 20121103atau tidak.

totten
sumber
4
Jika sudah dalam format ISO8601 (YYYY-MM-DD) Anda tidak perlu menghapus karakter apa pun atau mengubahnya menjadi integer. Bandingkan saja string first == secondatau first < secondatau first > second. Itu salah satu dari banyak keindahan dengan ISO8601 dibandingkan dengan MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM atau MM / YY / DD.
beberapa
5

Saya biasanya menyimpan Datesseperti timestamps(Number)di database.

Ketika saya perlu membandingkan, saya cukup membandingkan antara cap waktu atau

mengubahnya menjadi Objek Tanggal dan kemudian bandingkan dengan > <jika perlu.

Perhatikan bahwa == atau === tidak berfungsi dengan baik kecuali variabel Anda adalah referensi dari Objek Tanggal yang sama.

Konversikan objek Date tersebut menjadi stempel waktu (angka) terlebih dahulu dan kemudian bandingkan persamaannya.


Tanggal ke Timestamp

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

Stempel waktu ke Tanggal

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);
jwchang
sumber
Ini adalah jawaban terbaik - dan jsperf.com/comparing-date-objects
Scott Stensland
3

Sebelum membandingkan Datesobjek, coba atur kedua milidetiknya ke nol seperti Date.setMilliseconds(0);.

Dalam beberapa kasus di mana Dateobjek dibuat secara dinamis dalam javascript, jika Anda terus mencetak Date.getTime(), Anda akan melihat milidetik berubah, yang akan mencegah persamaan kedua tanggal.

Júlio Paulillo
sumber
3

Performa

Hari ini 2020.02.27 Saya melakukan tes solusi yang dipilih pada Chrome v80.0, Safari v13.0.5 dan Firefox 73.0.1 pada MacOs High Sierra v10.13.6

Kesimpulan

  • solusi d1==d2(D) dan d1===d2(E) adalah yang tercepat untuk semua browser
  • solusi getTime(A) lebih cepat dari valueOf(B) (keduanya sedang cepat)
  • solusi F, L, N paling lambat untuk semua browser

masukkan deskripsi gambar di sini

Detail

Di bawah ini cuplikan solusi yang digunakan dalam tes kinerja disajikan. Anda dapat melakukan tes di mesin Anda DI SINI

Hasil untuk chrome

masukkan deskripsi gambar di sini

Kamil Kiełczewski
sumber
Tetapi d1==d2atau d1===d2tidak berguna dalam konteks pertanyaan.
TheMaster
1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

Gunakan kode ini untuk membandingkan tanggal menggunakan javascript.

Terima kasih D. Jova

Astaga
sumber
Saya pikir ini adalah jawaban yang bagus karena kami memiliki format "dd / mm / yy" dan kami harus melakukannya untuk membandingkan kedua tanggal. Saya tidak tahu apakah itu jawaban terbaik tetapi cukup. Terima kasih sudah berbagi.
danigonlinea
1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}
pengguna1931504
sumber
1

Inilah yang saya lakukan di salah satu proyek saya,

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

memanggil ini di form onsubmit. semoga ini membantu.

Brijesh
sumber