İki tarihi JavaScript ile karşılaştırın


1951

Birisi JavaScript kullanarak geçmişte olmayan iki tarihin değerlerini karşılaştırmak için bir yol önerebilir mi? Değerler metin kutularından gelecektir.


17
DateTime ve JS manipülasyon söz konusu olduğunda, momentjs daha fazla bakmıyorum :)
Halceyon

47
2 tarihi karşılaştırmak için momentjs kullanmaya gerek yoktur. Sadece javascript Date nesnesini kullanın. Daha fazla ayrıntı için ana cevaba bakın.
Lukas Liesis

Aşağıdaki cevaba başvurabilirsiniz: stackoverflow.com/questions/4812152/… getDateDifference ve getDifferenceInDays öğelerini kontrol edin.
Vikash Rajpurohit

Size Moment.js'den daha fazla bakmak için bir neden vereceğim ( ki seviyorum, AMA ... ): Yükleri döngüye
Geek Stocks

Zaman farkını birimlere (saniye, dakika, saat vb.) Ayırmak için kullanışlı bir işlev için stackoverflow.com/questions/1968167/… adresindeki cevaba bakın . Bu yanıtı şimdi stackoverflow.com/a/46529159/3787376 adresinde de bulabilirsiniz .
Edward

Yanıtlar:


2284

Tarih nesne istediğini yapacak - o zaman, her tarih için yapısını birini kullanarak bunları karşılaştırmak >, <, <=veya>= .

==, !=, ===Ve !==operatörler kullanmak gerektirir date.getTime()olduğu gibi

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

açık olmak gerekirse, nesnelerin çalışmadığı tarihle doğrudan eşitliği kontrol etmek

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)

Kendinizi giriş doğrulama cehenneminde bulabilmeniz için, metin kutuları yerine açılır menüler veya kısıtlanmış bir tarih girişi biçimi kullanmanızı öneririm.


64
Ace'nin yöntemi bile güvenli değildir. Önce milisaniyeyi sıfırlamanız gerekir ve hatta tüm zamanı sıfırlamak isteyebilirsiniz. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Bu, .getTime () kullanımı ile birlikte size doğru bir karşılaştırma sonucu verecektir
patrick

102
@patrick, setHours(0,0,0,0)bu yolu aramayı önerin . Arama setMinutes()vb. İhtiyacını ortadan kaldırır . Ayrıca, daha hızlı yürütür.
Karl

26
İstenilen sonucu elde etmek için == veya === kaçınmak: jsfiddle.net/P4y5J now> = anotherNow && now <= anotherNow şimdi gerçek FYI
Jason Sebring

5
Neden toString()yöntemi her iki tarihte de kullanmıyorsunuz ve sonra işleçle karşılaştırmıyorsunuz ==? Zamanı sıfırlamak ve daha sonra karşılaştırmaktan çok daha kolay görünüyor, bunun bir dezavantajı var mı?
user2019515

13
Nesnelerin kendilerini karşılaştırmaktan kaçınmak için tarihlerinizin sayısal değerlerini de karşılaştırabilirsiniz: date1.valueOf () == date2.valueOf ()
madprog

421

Javascript'teki tarihleri ​​karşılaştırmanın en kolay yolu, önce bunu bir Date nesnesine dönüştürmek ve sonra bu tarih nesnelerini karşılaştırmaktır.

Aşağıda üç işlevi olan bir nesne bulacaksınız:

  • dates.compare (a, b)

    Bir sayı döndürür:

    • -1, <b
    • A = b ise 0
    • 1 a> b ise
    • A veya b yasa dışı bir tarihse NaN
  • dates.inRange (d, başlangıç, bitiş)

    Bir boole veya NaN döndürür:

    • Gerçek ise d arasındadır başlangıcında ve sonunda (dahil)
    • Yanlış eğer d önce olduğu başlatmak veya sonrasında sonuna .
    • NaN, tarihlerden biri veya daha fazlası yasa dışı ise.
  • dates.convert

    Diğer işlevler tarafından girdilerini bir tarih nesnesine dönüştürmek için kullanılır. Giriş olabilir

    • bir tarih -object: Giriş olduğu gibi döndürülür.
    • bir dizi : [yıl, ay, gün] olarak yorumlanır. NOT ayı 0-11'dir.
    • bir numara : 1 Ocak 1970 (zaman damgası) itibaren milisaniye sayısı olarak yorumlanır
    • bir ip : "YYYY / AA / GG", "AA / GG / YYYY", "31 Ocak 2009" vb. gibi birkaç farklı biçim desteklenir.
    • bir nesne : Yıl, ay ve tarih niteliklerine sahip bir nesne olarak yorumlanır. NOT ayı 0-11'dir.

.

// 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
        );
    }
}

11
(a > b) - (a < b)tarih dizisi sıralamak için yararlıdır
nktssh 14:15

@nikita Evet, Array.prototype.sorttüm değerleri geçerli tarihler olduğu sürece bu sonucu döndüren bir işlev kullanılabilir . Geçersiz tarihler varsa, böyle bir şey kullanmanızı öneririzfunction ( 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; }
bazı

4
@ nktssh — belki de return a - bdaha basittir ve tüm iade ifadesinin yerine geçer.
RobG

284

Karşılaştırın <ve >her zamanki gibi, ancak ilgili her şey =bir +önek kullanmalıdır . Şöyle ki:

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

Bu yardımcı olur umarım!


81
çok yavaş :) Ben tercih x.getTime() === y.getTime()yöntemi, hem okunabilir ve son derece hızlı görmek jsperf
huysentruitw

24
+Operatör bir dizi halinde ifade dönüştürmek için çalışır. Date.valueOf()aynı şey geri dönüşüm (kullanılır Date.getTime().
Salman A

13
@WouterHuysentruit Her ikisi de çok hızlı (en yavaş tarayıcıda> 3 Milyon OPS). Daha okunabilir olduğunu düşündüğünüz yöntemi kullanın
Eloims

13
O Not içeren her şeye '=' '+' öneki kullanmalıdır Cevabınız parçası yanlıştır. <, <=, >Ve >=aynı algoritma (kullanımı Anahtar ilişkisel karşılaştırma algoritması planda).
Salman A

2
developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… Cevabınız sayesinde, iş yerinde geliştirdiğim hizmetin izlemesi zor olan korkunç bir hata vardı.
Gyuhyeon Lee

157

İlişkisel işleçler < <= > >=JavaScript tarihlerini karşılaştırmak için kullanılabilir:

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

Ancak, eşitlik operatörleri == != === !==tarihleri ​​karşılaştırmak için kullanılamaz, çünkü :

  • İki farklı nesne, katı veya soyut karşılaştırmalar için asla eşit değildir.
  • Nesneleri karşılaştıran bir ifade yalnızca işlenenler aynı Nesne'ye başvuruyorsa doğrudur.

Eşitlik için tarihlerin değerini aşağıdaki yöntemlerden herhangi birini kullanarak karşılaştırabilirsiniz:

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

Hem Date.getTime()ve Date.valueOf()1 Ocak 1970, 00:00 UTC beri milisaniye sayısını döndürür. Hem Numberişlev hem de tekli +operatör valueOf()sahne arkasındaki yöntemleri çağırır .


String'i Date nesnesine dönüştürmek güvenli mi? Bu istisna atamaz veya güvenilir olmayan sonuçlar veremez mi? JS'de comaring tarihleri ​​yapmanın en güvenilir yolu ne olabilir? Güvenilir olmayan sonuçlar söylediğinizde, tarih biçiminin değişmeyeceğinden emin olsak bile bu yöntem farklı / yanlış değerler verebilir mi?> "Perşembe, 10 Ağu 2017" olacaktır. Buradaki yardımınız çok takdir ediliyor.
user2696258

Bu, farklı işletim sistemi / tarayıcılarda / cihazlarda aynı tarih değeri için güvenilir olmayan sonuçlar verebilir mi?
user2696258

1
@ user2696258 bu iki Date nesnesini karşılaştırmanın en güvenilir yoludur . Bir dizeyi tarihe dönüştürmek farklı bir sorundur ... tarih ayrıştırma kitaplığı kullanın veya kendi çözümünüzü kullanın. Thursday, 10 Aug 2017standart olmayan bir biçimdir ve farklı tarayıcılar farklı şekilde ayrıştırabilir veya hiç ayrıştıramayabilir. Hakkındaki notlara bakın Date.parse.
Salman A

88

Şimdiye kadar en kolay yöntem, bir tarihi diğerinden çıkarmak ve sonucu karşılaştırmaktır.

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

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


68

JavaScript'te tarihleri karşılaştırmak oldukça kolaydır ... JavaScript, karşılaştırmayı yapmayı çok kolaylaştıran tarihler için yerleşik bir karşılaştırma sistemine sahiptir ...

İki tarih değerini karşılaştırmak için şu adımları izleyin, örneğin her birinde bir Tarih değeri olan 2 girişiniz var Stringve bunları karşılaştırmanız ...

1. bir giriş olsun 2 dize değerleri var ve bunları karşılaştırmak istiyorum, bunlar aşağıdaki gibidir:

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

2.Date Object Tarih değerleri olarak karşılaştırılması gerekir , bu yüzden bunları basitçe new Date()açıklama basitleştirmek için yeniden atamak , kullanarak , bugüne dönüştürmek gerekir , ama yine de istediğiniz gibi yapabilirsiniz:

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

3. Şimdi bunları kullanarak> < >= <=

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

Javascript'teki tarihleri ​​karşılaştır


Tarihleri ​​karşılaştırmaya yönelik çoğu çözümün herhangi bir tarayıcıda çalıştığını buldum. Yaşadığım sorun IE ile oldu. Bu çözüm tüm yönetim kurulu genelinde çalıştı. Teşekkürler Alireza!
Joshua Oglesbee

2
Çalışmıyor. Ve işe yaramamalı. Tarih nesnesini karşılaştırıyorsunuz.
maxisam

3
Hayır @maxisam, bunun nedeni karşılaştırma operatörlerinin çalışır ( <, >, <=, >=) Tarih nesneleri unix dönemin (saniye) ilk dönüştürülür ve bu cezayı çalışır edilir kullanılıyor. Ancak bu, date1 == date2bir hatanın değer olarak değil, örnek eşitliğinin kontrol edildiği yerlerde yapıldığı gibi yaygın bir hataya yol açabilir . Bunu önlemek ve tarih değerinin eşitliğini kontrol etmek için bu işe yarayacaktır: date1.valueOf() == date2.valueOf()veya daha kısadate1+0 == date2+0
humanityANDpeace

Gönderilen not MDN'yi Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. ve 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

Yalnızca günü karşılaştırın (zaman bileşenini yok sayma):

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

Kullanımı:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

bu iyi. ama ne nextDay veya previousDay karşılaştırırsanız. Bu Date.prototype.nextDay = işlev (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = işlev (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } ancak yalnızca bu ayda çalışır. ay veya yıl boyunca nasıl karşılaştırırım
Paresh3489227

32

hangi format?

Bir Javascript Date nesnesi oluşturursanız , yalnızca bir milisaniye fark elde etmek için bunları çıkarabilirsiniz (düzenle: veya sadece karşılaştırın):

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

1
Çıkarma, ==yukarıda belirtilen karşılaştırma probleminden kaçındığı için iyi bir fikirdir .
devios1

Hangi JavaScript REPL'sini kullanıyorsunuz?
hyde

JSDB - bkz. Jsdb.org - Python'un tercih ettiğim dil olduğu bugünlerde daha az kullanıyorum, ama yine de harika bir yardımcı program.
Jason S

1
@ StuartP.Bentley Bilmiyorum, çünkü hiçbirini kullanmıyorum. Ben jsdb kullanıyorum.
Jason S

büyük miktarda tarih geçirirken, bu en etkili görünüyor çünkü getTime () ile dönüştürmeye gerek yok.
pcarvalho

16

bu kodu kullanıyorsun,

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");
  }

Ayrıca bu bağlantıyı da kontrol edin http://www.w3schools.com/js/js_obj_date.asp


3
W3Schools'a başvurmamak için bir neden: w3fools.com - güzel bir çözüm - standartlara uygun mu ve tüm tarayıcılarda çalışıyor mu?
Mathias Lykkegaard Lorenzen

1
Mozilla Geliştirici Ağı'na daha iyi bakın: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Daniel Lidström

16

KISA CEVAP

İşte dateTime> 'dan dateTime Demo'ya eylem halinde {boolean} döndüren bir işlev

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

açıklama

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 

Artık sayı türünde her iki datetime sahip olduğunuz için bunları herhangi bir Karşılaştırma işlemiyle karşılaştırabilirsiniz

(>, <, =,! =, ==,! ==,> = VE <=)

Sonra

C#Özel Tarih ve Saat Biçimi Dizesi hakkında bilginiz varsa, bu kitaplık aynı şeyi yapmalı ve tarih saat dizesini veya unix biçiminde geçiriyor olsanız da tarih ve saati dtmFRM biçimlendirmenize yardımcı olmalıdır.

kullanım

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

tek yapmanız gereken bu formattan herhangi birini kütüphane jsdosyasında pasifize etmek


yeni Tarih (dtmfrom)> = yeni Tarih (dtmto) yeni Tarih (dtmfrom) .getTime ()> = yeni Tarih (dtmto) .getTime ()
Mina Gabriel

Belki de, fark, tarayıcıya bağlı olarak, işlem başına yaklaşık 30 ila 120 nanosaniyedir (diyelim 0.000000075 saniye), bu yüzden gerçekten önemli değil.
RobG

16

Basit yol,

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

if (new Date(first) > new Date(second) {
    .....
}

14

Not - Yalnızca Tarih Bölümünü Karşılaştır:

Javascript'te iki tarihi karşılaştırdığımızda. Saatler, dakikalar ve saniyeler de dikkate alınır .. Yani sadece tarihi karşılaştırmamız gerekirse, yaklaşım budur:

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

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

Şimdi: if date1.valueOf()> date2.valueOf()bir cazibe gibi çalışacak.


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

1
A veya b tipi nedir? Tarih? Hangi format? Bu benimle çalışmıyor gibi görünüyor.
Luci

5
varsayarak ave bvarlık Dateda kullanabilir nesnelerireturn a*1 == b*1;
Udo G

4
@UdoG: Daha kısa:+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

11

Mevcut birçok seçeneğe başka bir olasılık daha eklemek için deneyebilirsiniz:

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

... bu benim için çalışıyor gibi görünüyor. Tabii ki her iki tarihin de tanımlanmamış olduğundan emin olmalısınız ...

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

Bu şekilde, her ikisi de tanımlanmamışsa pozitif bir karşılaştırma yapılmasını sağlayabiliriz veya ...

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

... eşit olmamalarını tercih ederseniz.


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

Yöntem dateTimeA, 1'den büyükse 1 değerini döndürür.dateTimeB

Yöntemi döndürür 0 ise dateTimeAeşittirdateTimeB

Yöntem döner -1 ise dateTimeAdaha azdırdateTimeB


3
DateNesneler için tarih karşılaştırması yapmak için Moment gibi harici bir kitaplık kullanmaya gerek yoktur .
amb

Benim kullanım durumum için kesinlikle gerekliydi. Teşekkürler Razan!
razorsyntax

1
Neden an gibi kullanışlı karşılaştırma yöntemleri ile geldiğinde bile operatörleri <veya >operatörleri kullanıyorsunuz .isBeforeve .isAfterhepsi bu dokümanlarda
svarog

10

ZAMAN BÖLGESİNE DİKKAT EDİN

Javascript tarihinin saat dilimi fikri yoktur . "Yerel" saat dilimindeki dizelere çeviri yapmak için kullanışlı işlevlere sahip bir an (çağdan beri keneler) zamanıdır. Tarih nesnelerini kullanarak tarihlerle çalışmak istiyorsanız, buradaki herkesin yaptığı gibi, tarihlerin söz konusu tarihin başında gece yarısı UTC'yi temsil etmesini istersiniz. Bu, yaratılışlarının mevsimine veya saat dilimine bakılmaksızın tarihlerle çalışmanıza izin veren ortak ve gerekli bir sözleşmedir. Bu nedenle, özellikle gece yarısı UTC Tarihi nesnenizi oluştururken, saat dilimi kavramını yönetmek için çok dikkatli olmanız gerekir.

Çoğu zaman, tarihinizin kullanıcının saat dilimini yansıtmasını istersiniz. Bugün doğum gününüzse tıklayın . NZ ve ABD'deki kullanıcılar aynı anda tıklayıp farklı tarihler alırlar. Bu durumda, bunu yapın ...

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

Bazen, uluslararası karşılaştırılabilirlik yerel doğruluğu azaltır. Bu durumda, bunu yapın ...

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

Artık tarih nesnelerinizi diğer yanıtların önerdiği gibi doğrudan karşılaştırabilirsiniz.

Oluşturduğunuzda saat dilimini yönetmeye özen gösterdiğinizde, bir dize temsiline geri döndüğünüzde saat dilimini de dışarıda tuttuğunuzdan emin olmanız gerekir. Böylece güvenle kullanabilirsiniz ...

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

Ve her şeyden tamamen kaçının, özellikle ...

  • getYear(), getMonth(),getDate()

8

Diyelim ki A ve B tarih nesnelerini aldınız, EPOC zaman değerlerini alın, sonra milisaniye cinsinden farkı elde etmek için çıkartın.

var diff = +A - +B;

Bu kadar.


8

İki tarihi karşılaştırmak için şu adreste bulunan date.js JavaScript kütüphanesini kullanabiliriz: https://code.google.com/archive/p/datejs/downloads

ve Date.compare( Date date1, Date date2 )yöntemi kullanın ve aşağıdaki sonuç anlamına gelen bir sayı döndürür :

-1 = tarih1 lessthan tarih2'dir.

0 = değerler eşittir.

1 = tarih1, tarih2'den büyüktür.


8

0Aynı tarihi alırsanız iki tarihin milisaniye cinsinden farkını çıkarın

function areSameDate(d1, d2){
    return d1 - d2 === 0
}

7

Javascript'te serbest metinden tarihler oluşturmak için, Date () nesnesine ayrıştırmanız gerekir.

Serbest metin alan yeni bir tarihe dönüştürmeye çalışan Date.parse () kullanabilirsiniz, ancak sayfa üzerinde kontrolünüz varsa, bunun yerine HTML seçim kutularını veya YUI takvim kontrolü veya jQuery kullanıcı arabirimi gibi bir tarih seçici kullanmanızı öneririm Datepicker .

Diğer kişilerin işaret ettiği gibi bir tarih edindikten sonra, tarihleri ​​çıkarmak ve sayıyı (saniye cinsinden) bir günün saniye sayısına (60 * 60 *) bölerek birkaç güne dönüştürebilmek için basit aritmetik kullanabilirsiniz. 24 = 86400).


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;
}

5

"Bazıları" tarafından gönderilen kodun geliştirilmiş bir sürümü

/* 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 
        );
};

kullanımı:

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

Muhtemelen a , yöntemin çağrıldığı Date örneğidir. Hangi durumda olabilir bir geçersiz bir tarih olacak, ama yine de bir Date örneği olacak?
RobG

5

Tarih biçiminiz şuysa, bu kodu kullanabilirsiniz:

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

20121121Sayının büyük olup olmadığını kontrol edecektir 20121103.


4
Zaten ISO8601 biçimindeyse (YYYY-AA-GG) herhangi bir karakteri kaldırmanız veya bir tamsayıya dönüştürmeniz gerekmez. Sadece dizeleri karşılaştırın first == secondveya first < secondveya first > second. Bu ISO8601 ile MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM veya MM / YY / DD'ye kıyasla birçok güzellikten biridir.
Bazı

5

Genellikle veritabanlarında Datesolduğu timestamps(Number)gibi saklarım.

Karşılaştırmam gerektiğinde, sadece bu zaman damgaları veya

Tarih Nesnesine dönüştürün ve > <gerekirse karşılaştırın .

== veya === Değişkenleriniz aynı Tarih Nesnesinin referansları olmadıkça düzgün çalışmaz.

Bu Date nesnelerini önce zaman damgasına (sayı) dönüştürün ve sonra eşitliklerini karşılaştırın.


Tarih Damgası

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

Tarihe Kadar Zaman Damgası

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);

Bu en iyi cevaptır - ve en hızlı jsperf.com/comparing-date-objects
Scott Stensland

3

DatesNesneyi karşılaştırmadan önce , her iki milisaniyeyi de sıfır olarak ayarlamayı deneyin Date.setMilliseconds(0);.

DateJavascript'te nesnenin dinamik olarak oluşturulduğu bazı durumlarda , yazdırmaya devam Date.getTime()ederseniz milisaniyenin değiştiğini görürsünüz, bu da her iki tarihin eşitliğini önler.


3

Verim

Bugün 2020.02.27 Chrome v80.0, Safari v13.0.5 ve MacOs High Sierra v10.13.6'da Firefox 73.0.1'de seçilen çözümlerin testlerini yapıyorum

Sonuçlar

  • d1==d2(D) ve d1===d2(E) çözümleri tüm tarayıcılar için en hızlı çözümdür
  • getTime(A) çözeltisi ( valueOfB) ' den daha hızlıdır (her ikisi de orta hızlıdır)
  • çözümler F, L, N tüm tarayıcılar için en yavaş çözümlerdir

resim açıklamasını buraya girin

ayrıntılar

Aşağıda performans testlerinde kullanılan snippet çözümleri sunulmaktadır. BURADA makinenizde test yapabilirsiniz

Chrome kelimesi için sonuçlar

resim açıklamasını buraya girin


Ama d1==d2ya d1===d2da soru bağlamında işe yaramaz.
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;
        }

Javascript kullanarak tarihi karşılaştırmak için bu kodu kullanın.

Teşekkürler D.Jeeva


Bence bu iyi bir cevap çünkü "gg / aa / yy" biçimine sahibiz ve bunu her iki tarihi karşılaştırmak için de yapmalıyız. En iyi cevap olup olmadığını bilmiyorum ama yeterli. Paylaştığın için teşekkürler.
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;
}

1

İşte projelerimden birinde yaptığım şey,

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;
     }
}

bunu form onubmit olarak çağırıyor. Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.