Porównaj dwie daty z JavaScript

1949

Czy ktoś może zasugerować sposób porównania wartości dwóch dat większych niż, mniejszych niż i wcześniejszych przy użyciu JavaScript? Wartości będą pochodzić z pól tekstowych.

Alex
źródło
17
Jeśli chodzi o DateTime i manipulacje w JS, nie patrzę dalej niż momentjs :)
Halceyon
47
nie trzeba używać momentjs do porównywania 2 dat. Wystarczy użyć obiektu Date czystego javascript. Sprawdź główną odpowiedź, aby uzyskać więcej informacji.
Lukas Liesis,
Możesz odnieść się do następującej odpowiedzi: stackoverflow.com/questions/4812152/... Sprawdź getDateDifference i getDifferenceInDays, jeśli może to pomóc.
Vikash Rajpurohit
Dam ci powód, aby szukać dalej niż Moment.js ( co uwielbiam, ALE ... ): Nie używaj do zapętlania ładunków
Geek Stocks
Przydatną funkcję dzielącą różnicę czasu na jednostki (sekundy, minuty, godziny itp.) Można znaleźć w odpowiedzi na stronie stackoverflow.com/questions/1968167/… . Ta odpowiedź jest teraz dostępna również na stronie stackoverflow.com/a/46529159/3787376 .
Edward

Odpowiedzi:

2283

Obiekt Date będą robić to, co chcesz - konstrukt jeden na każdy dzień, a następnie porównać je za pomocą >, <, <=lub >=.

==, !=, ===, I !==operatorzy wymaga użycia date.getTime()jak w

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

dla jasności, sprawdzanie równości bezpośrednio z obiektami daty nie będzie działać

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)

Sugeruję jednak stosowanie list rozwijanych lub podobnej ograniczonej formy wprowadzania daty zamiast pól tekstowych, aby nie znaleźć się w piekle sprawdzania poprawności danych wejściowych.

księżycowy cień
źródło
64
Nawet metoda Ace'a nie jest bezpieczna. Najpierw musisz zresetować milisekundy, a może nawet chcesz zresetować cały czas. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); To w połączeniu z użyciem .getTime () da dokładny wynik porównania
Patrick
102
@patrick, sugeruj dzwonienie w setHours(0,0,0,0)ten sposób. Eliminuje potrzebę dzwonienia setMinutes()itp. Ponadto działa szybciej.
Karl
26
unikanie == lub ===, aby uzyskać pożądany wynik: jsfiddle.net/P4y5J teraz> = anotherNow && now <= anotherNow JEST prawdziwą informacją
Jason Sebring
5
Dlaczego nie skorzystać z toString()metody w obu terminach, a następnie porównać z ==operatorem? Wydaje się o wiele łatwiejsze niż resetowanie czasu i późniejsze porównywanie, czy są w tym jakieś wady?
user2019515
13
Możesz także porównać wartości liczbowe swoich dat, aby uniknąć porównywania samych obiektów: date1.valueOf () == date2.valueOf ()
madprog
421

Najłatwiejszym sposobem porównywania dat w javascript jest najpierw konwersja do obiektu Date, a następnie porównanie tych obiektów date.

Poniżej znajduje się obiekt z trzema funkcjami:

  • daty. porównaj (a, b)

    Zwraca liczbę:

    • -1 jeśli a <b
    • 0, jeśli a = b
    • 1, jeśli a> b
    • NaN, jeśli a lub b jest nielegalną datą
  • date.inRange (d, początek, koniec)

    Zwraca wartość logiczną lub NaN:

    • prawdziwe jeśli d jest między początkiem a końcem (włącznie)
    • fałszywe jeśli d jest przed początkiem lub po zakończeniu .
    • Nie dotyczy, jeśli jedna lub więcej dat jest nielegalnych.
  • date.convert

    Używany przez inne funkcje do konwersji danych wejściowych na obiekt daty. Dane wejściowe mogą być

    • data -przedmiot: Wejście jest zwracane, jak jest.
    • tablica : interpretowane jako [rok, miesiąc, dzień]. UWAGA miesiąc to 0-11.
    • za numer : interpretowane jako liczba milisekund od 1 stycznia 1970 (znacznik czasu)
    • za ciąg : Kilka różnych formatów jest obsługiwana, jak "YYYY / MM / DD", "MM / dd / yyyy", "31 stycznia 2009" etc.
    • obiektu : interpretowane jako obiekt z roku, miesiąca i dnia atrybutów. UWAGA miesiąc to 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
        );
    }
}
trochę
źródło
11
(a > b) - (a < b)przydaje się do sortowania tablicy dat
nktssh
@nikita Tak, a funkcja, która zwraca ten wynik, może być używana z Array.prototype.sortwarunkiem, że wszystkie wartości są poprawnymi datami. Jeśli mogą istnieć niepoprawne daty, polecam użycie czegoś takiegofunction ( 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; }
około
4
@ nktssh - może, ale return a - bjest prostszy i zastępuje całą instrukcję return.
RobG
284

Porównaj <i >jak zwykle, ale wszystko, co wymaga, =powinno mieć +prefiks. Tak jak:

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

Mam nadzieję że to pomoże!

Daniel Lidström
źródło
81
strasznie powolne :) Wolę x.getTime() === y.getTime()metodę, zarówno czytelną, jak i bardzo szybką, zobacz jsperf
huysentruitw
24
+Operator próbuje przekształcić wyrażenie do liczby. Date.valueOf()służy do konwersji (który powraca to samo, co Date.getTime().
Salman A
13
@ WouterHuysentruit Oba są bardzo szybkie (> 3 miliony OPS w najwolniejszej przeglądarce). Użyj metody, która Twoim zdaniem jest bardziej czytelna
Eloims,
13
Zauważ, że wszystko , co zawiera „=”, powinno zawierać część „+” prefiksu twojej odpowiedzi jest niepoprawne. <, <=, >I >=korzystać z tego samego algorytmu ( abstrakcyjny algorytm porównania relacyjny ) za kulisy.
Salman A
2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Dzięki twojej odpowiedzi usługa, którą rozwijam w pracy, zawierała straszny błąd, który był trudny do śledzenia.
Gyuhyeon Lee
157

Operatorów relacyjnych < <= > >=można używać do porównywania dat 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

Jednak operatory równości == != === !==nie mogą być używane do porównywania (wartości) dat, ponieważ :

  • Dwa odrębne obiekty nigdy nie są równe ani dla porównań ścisłych, ani abstrakcyjnych.
  • Wyrażenie porównujące obiekty jest prawdziwe tylko wtedy, gdy operandy odnoszą się do tego samego obiektu.

Możesz porównać wartość dat równości za pomocą dowolnej z następujących metod:

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

Zarówno Date.getTime()i Date.valueOf()zwraca liczbę milisekund od 1 stycznia 1970, 00:00 UTC. Zarówno Numberfunkcja, jak i +operator jednoargumentowy wywołują valueOf()metody za kulisami.

Salman A.
źródło
Czy konwersja obiektu String na datę jest bezpieczna? Czy nie może to wyrzucić wyjątku lub dać niewiarygodnych wyników? Jaki może być najbardziej niezawodny sposób porównywania dat w JS? Gdy powiesz niewiarygodne wyniki, czy ta metoda może podawać inne / nieprawidłowe wartości, nawet jeśli jesteśmy pewni, że format daty się nie zmieni -> Byłby to „Czwartek, 10 sierpnia 2017 r.”. Twoja pomoc tutaj jest bardzo doceniana.
user2696258,
Czy może to dać niewiarygodne wyniki dla tej samej wartości daty w różnych systemach operacyjnych / przeglądarkach / urządzeniach?
user2696258,
1
@ user2696258 jest to najbardziej niezawodny sposób porównywania dwóch obiektów Date . Konwersja ciągu na inny to inny problem ... skorzystaj z biblioteki parsowania daty lub rzuć własne rozwiązanie. Thursday, 10 Aug 2017jest niestandardowym formatem i różne przeglądarki mogą go analizować inaczej lub w ogóle go nie analizować. Zobacz uwagi na temat Date.parse.
Salman A
88

Zdecydowanie najłatwiejszą metodą jest odjęcie jednej daty od drugiej i porównanie wyniku.

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

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

Peter Wilkinson
źródło
68

Porównywanie dat w JavaScript jest dość łatwe ... JavaScript ma wbudowany system porównywania dat dzięki czemu porównanie jest tak łatwe ...

Wykonaj następujące kroki, aby porównać 2 wartości dat, na przykład masz 2 dane wejściowe, z których każde ma wartość Data String i możesz je porównać ...

1. masz 2 ciągi znaków, które otrzymujesz z wejścia i chcesz je porównać, są one jak poniżej:

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

2. Należy Date Objectje porównać jako wartości daty, więc po prostu przekonwertuj je na datę, używając new Date(), po prostu ponownie przypisuję je dla uproszczenia wyjaśnień, ale możesz to zrobić tak, jak chcesz:

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

3. Teraz po prostu porównaj je, używając> < >= <=

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

porównaj daty w javascript

Alireza
źródło
Przekonałem się, że większość rozwiązań do porównywania dat działa w dowolnej przeglądarce. Wystąpił problem z IE. To rozwiązanie działało powszechnie. Dzięki Alireza!
Joshua Oglesbee
2
To nie działa I to nie powinno działać. Porównujesz obiekt daty.
maxisam
3
@maxisam Nie, to nie działa, ponieważ operatorów porównania ( <, >, <=, >=) są wykorzystywane, data obiekty są przekształcane pierwszy epoki Uniksa (w sekundach), i to działa dobrze. Może to jednak prowadzić do powszechnego błędu polegającego na tym, date1 == date2że rzeczywiście wprowadzany jest błąd jako nie wartość, ale sprawdzana jest równość instancji. Aby temu zapobiec i sprawdzić równość wartości daty, zadziałałoby to: date1.valueOf() == date2.valueOf()lub krócejdate1+0 == date2+0
humanityANDpeace
Uwaga z MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. i 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

Porównaj tylko dzień (ignorując składnik czasu):

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

Stosowanie:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}
mpen
źródło
to jest dobre. ale co jeśli porównam nextDay lub previousDay. próbowałem tego Date.prototype.nextDay = funkcja (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); }, ale zadziała tylko w tym miesiącu. jak porównać w ciągu miesiąca lub lat
Paresh3489227,
32

jaki format

Jeśli konstruujesz obiekt JavaScript Date , możesz go odjąć, aby uzyskać różnicę w milisekundach (edytuj: lub po prostu porównaj):

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.
źródło
1
Odejmowanie jest dobrym pomysłem, ponieważ pozwala uniknąć ==wspomnianego wyżej problemu porównania.
devios1,
Z jakiego JavaScript REPL korzystasz?
hyde
JSDB - patrz jsdb.org - Obecnie używam go rzadziej, ponieważ Python jest moim wybranym językiem, ale nadal jest świetnym narzędziem.
Jason S
1
@ StuartP.Bentley Nie wiem, ponieważ nie używam żadnego z nich. Używam jsdb.
Jason S
podczas przechodzenia przez dużą liczbę dat wydaje się to najbardziej wydajne, ponieważ nie trzeba konwertować za pomocą getTime ().
pcarvalho
16

używasz tego kodu,

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

A także sprawdź ten link http://www.w3schools.com/js/js_obj_date.asp

pozostać głodny
źródło
3
Powód, dla którego nie należy odwoływać się do W3Schools: w3fools.com - fajne rozwiązanie - czy jest zgodny ze standardami i czy działa we wszystkich przeglądarkach?
Mathias Lykkegaard Lorenzen
1
Lepiej zapoznaj się z Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Daniel Lidström
16

KRÓTKA ODPOWIEDŹ

Oto funkcja, która zwraca {boolean}, jeśli od dateTime> do dateTime Demo w akcji

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

Wyjaśnienie

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 

ponieważ teraz masz oba typy datetime w liczbach, możesz je porównać z dowolnymi operacjami porównania

(>, <, =,! =, ==,! ==,> = AND <=)

Następnie

jeśli znasz C#niestandardowy ciąg formatu daty i godziny, ta biblioteka powinna zrobić dokładnie to samo i pomóc sformatować datę i godzinę dtmFRM bez względu na to, czy przekazujesz ciąg daty lub formatu uniksowego

Stosowanie

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

PRÓBNY

wszystko, co musisz zrobić, to przekazać dowolny z tych formatów spacyfikowanych w jspliku biblioteki

Mina Gabriel
źródło
nowa data (dtmfrom)> = nowa data (dtmto) jest znacznie wolniejsza niż nowa data (dtmfrom) .getTime ()> = nowa data (dtmto) .getTime ()
Mina Gabriel
Być może, ale różnica wynosi około 30 do 120 nanosekund (powiedzmy 0,000000075 sekund) na operację, w zależności od przeglądarki, więc nie jest tak naprawdę znacząca.
RobG
15

Prostym sposobem jest

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

if (new Date(first) > new Date(second) {
    .....
}
MICHAEL PRABHU
źródło
14

Uwaga - Porównaj tylko część Data:

Kiedy porównamy dwie daty w javascript. Wymaga to także godzin, minut i sekund. Więc jeśli musimy tylko porównać tylko datę, oto takie podejście:

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

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

Teraz: if date1.valueOf()> date2.valueOf()będzie działać jak urok.

Sanjeev Singh
źródło
13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

źródło
1
Jaki jest typ a lub b? Daktyle? Jaki format To chyba ze mną nie działa.
Luci,
5
zakładanie ai bbycie Dateobiektami, których możesz również używaćreturn a*1 == b*1;
Udo G
4
@UdoG: Krótszy:+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
źródło
11

Aby dodać jeszcze jedną możliwość do wielu istniejących opcji, możesz spróbować:

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

... co wydaje mi się działać. Oczywiście musisz upewnić się, że obie daty nie są niezdefiniowane ...

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

W ten sposób możemy zapewnić dokonanie pozytywnego porównania, jeśli oba są również niezdefiniowane, lub ...

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

... jeśli wolisz, aby nie były równe.

Paweł
źródło
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"));

Metoda zwraca 1, jeśli dateTimeAjest większa niżdateTimeB

Metoda zwraca 0, jeśli dateTimeAjest równadateTimeB

Metoda zwraca -1, jeśli dateTimeAjest mniejsza niżdateTimeB

Razan Paul
źródło
3
Nie trzeba używać biblioteki zewnętrznej, takiej jak Moment, do porównywania dat dla Dateobiektów.
amb
Moment był absolutnie niezbędny w moim przypadku użycia. Dziękuję Razan!
razorsyntax,
1
dlaczego nawet używasz operatorów <lub >operatorów, gdy chwila już przychodzi z przydatnymi metodami porównywania, takimi jak .isBeforei .isAfter, wszystko to jest w dokumentacji
svarog
10

Uważaj na strefę czasową

Data javascript nie ma pojęcia strefy czasowej . To chwila (tyka od epoki) z przydatnymi funkcjami do tłumaczenia na i z ciągów w „lokalnej” strefie czasowej. Jeśli chcesz pracować z datami przy użyciu obiektów daty, tak jak wszyscy tutaj robią, chcesz, aby twoje daty reprezentowały północ UTC na początku danej daty. Jest to powszechna i niezbędna konwencja, która pozwala pracować z datami niezależnie od sezonu lub strefy czasowej ich utworzenia. Musisz więc być bardzo czujny, aby zarządzać pojęciem strefy czasowej, szczególnie podczas tworzenia obiektu o północy UTC.

Przez większość czasu będziesz chciał, aby data odzwierciedlała strefę czasową użytkownika. Kliknij, jeśli dzisiaj są twoje urodziny . Użytkownicy w Nowej Zelandii i USA klikają jednocześnie i uzyskują różne daty. W takim przypadku zrób to ...

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

Czasami międzynarodowa porównywalność przewyższa lokalną dokładność. W takim przypadku zrób to ...

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

Teraz możesz bezpośrednio porównać swoje obiekty daty, jak sugerują inne odpowiedzi.

Mając na uwadze zarządzanie strefą czasową podczas tworzenia, musisz także zachować strefę czasową podczas konwersji z powrotem do reprezentacji ciągu. Możesz więc bezpiecznie używać ...

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

I całkowicie unikaj wszystkiego innego, zwłaszcza ...

  • getYear(), getMonth(),getDate()
bbsimonbb
źródło
8

Załóżmy, że masz obiekty daty A i B, uzyskaj ich wartość EPOC, a następnie odejmij, aby uzyskać różnicę w milisekundach.

var diff = +A - +B;

To wszystko.

foobar
źródło
8

Aby porównać dwie daty, możemy użyć biblioteki JavaScript date.js, którą można znaleźć na stronie : https://code.google.com/archive/p/datejs/downloads

i użyj Date.compare( Date date1, Date date2 )metody, a zwróci liczbę, która oznacza następujący wynik:

-1 = data1 oznacza datę mniejszą niż 2.

0 = wartości są równe.

1 = data1 jest większa niż data2.

Salahin Rocky
źródło
8

Odejmij dwie daty, aby uzyskać różnicę w milisekundach, jeśli otrzymasz 0tę samą datę

function areSameDate(d1, d2){
    return d1 - d2 === 0
}
Yukulélé
źródło
7

Aby utworzyć daty z dowolnego tekstu w JavaScript, musisz go przeanalizować w obiekcie Date ().

Możesz użyć funkcji Date.parse (), która pobiera dowolny tekst, aby przekonwertować go na nową datę, ale jeśli masz kontrolę nad stroną, zaleciłbym zamiast niej użycie pól wyboru HTML lub selektora dat, takiego jak kontrolka kalendarza YUI lub interfejs użytkownika jQuery Wybór daty .

Gdy masz datę, jak zauważyli inni ludzie, możesz użyć prostej arytmetyki, aby odjąć daty i przekształcić ją z powrotem w liczbę dni, dzieląc liczbę (w sekundach) przez liczbę sekund w ciągu dnia (60 * 60 * 24 = 86400).

sh1mmer
źródło
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
źródło
5

Ulepszona wersja kodu opublikowana przez „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 
        );
};

stosowanie:

  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
źródło
Przypuszczalnie a to instancja Date, w której wywoływana jest metoda. W takim przypadku można być nieprawidłowa data, ale nadal być instancja Data?
RobG
5

Jeśli Twój format daty jest następujący, możesz użyć tego kodu:

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

Sprawdzi, czy 20121121liczba jest większa, 20121103czy nie.

skazany
źródło
4
Jeśli jest już w formacie ISO8601 (RRRR-MM-DD), nie musisz usuwać żadnych znaków ani konwertować ich na liczbę całkowitą. Wystarczy porównać ciągi first == secondlub first < secondlub first > second. To jedna z wielu piękności z ISO8601 w porównaniu do MM / DD / RR, DD / MM / RR, RR / DD / MM, DD / RR / MM lub MM / RR / DD.
jakieś
5

Zwykle przechowuję Datesjak timestamps(Number)w bazach danych.

Kiedy muszę porównać, po prostu porównuję te znaczniki czasu lub

przekonwertuj go na Date Object, a następnie porównaj w > <razie potrzeby.

Zauważ, że == lub === nie działa poprawnie, chyba że twoje zmienne są odniesieniami do tego samego obiektu Date.

Najpierw przekonwertuj te obiekty Date na datownik (liczbę), a następnie porównaj ich równość.


Data do znacznika czasu

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

Datownik do daty

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);
jwchang
źródło
To najlepsza odpowiedź - i najszybszy jsperf.com/comparing-date-objects
Scott Stensland
3

Przed porównaniem Datesobiektu spróbuj ustawić obie ich milisekundy na zero Date.setMilliseconds(0);.

W niektórych przypadkach, gdy Dateobiekt jest dynamicznie tworzony w javascript, jeśli będziesz go nadal drukować Date.getTime(), zobaczysz zmiany w milisekundach, co zapobiegnie równości obu dat.

Júlio Paulillo
źródło
3

Wydajność

Dzisiaj 2020.02.27 wykonuję testy wybranych rozwiązań na Chrome v80.0, Safari v13.0.5 i Firefox 73.0.1 na MacOs High Sierra v10.13.6

Wnioski

  • rozwiązania d1==d2(D) i d1===d2(E) są najszybsze dla wszystkich przeglądarek
  • rozwiązanie getTime(A) jest szybsze niż valueOf(B) (oba są średnio szybkie)
  • rozwiązania F, L, N są najwolniejsze dla wszystkich przeglądarek

wprowadź opis zdjęcia tutaj

Detale

Poniżej przedstawione są fragmenty kodu zastosowane w testach wydajności. Test możesz wykonać na swoim urządzeniu TUTAJ

Wyniki dla chrome

wprowadź opis zdjęcia tutaj

Kamil Kiełczewski
źródło
Ale d1==d2lub d1===d2jest bezużyteczny w kontekście pytania.
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;
        }

Użyj tego kodu, aby porównać datę za pomocą javascript.

Dzięki D.Jeeva

Jeeva
źródło
Myślę, że to dobra odpowiedź, ponieważ mamy format „dd / mm / rr” i musimy to zrobić, aby porównać obie daty. Nie wiem, czy to najlepsza odpowiedź, ale wystarczy. Dziękujemy za udostępnienie.
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;
}
użytkownik1931504
źródło
1

Oto, co zrobiłem w jednym z moich projektów,

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

nazywając to w formularzu onsubmit. mam nadzieję że to pomoże.

Brijesz
źródło