Porównywanie tylko części daty bez porównywania czasu w JavaScript


397

Co jest nie tak z poniższym kodem?

Może łatwiej byłoby po prostu porównać datę, a nie godzinę. Nie jestem też pewien, jak to zrobić, i szukałem, ale nie mogłem znaleźć mojego dokładnego problemu.

BTW, kiedy wyświetlam dwie daty w alercie, pokazują się one dokładnie tak samo.

Mój kod:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Czy istnieje prostszy sposób porównywania dat bez uwzględnienia godziny?

Odpowiedzi:


781

Wciąż uczę się JavaScript, a jedynym sposobem, który znalazłem, który pozwala mi porównać dwie daty bez czasu, jest użycie setHoursmetody obiektu Date i ustawienie godzin, minut, sekund i milisekund na zero. Następnie porównaj dwie daty.

Na przykład,

date1 = new Date()
date2 = new Date(2011,8,20)

date2zostanie ustawiony z godzinami, minutami, sekundami i milisekundami na zero, ale data1 spowoduje, że zostaną ustawione na godzinę utworzenia daty1. Aby pozbyć się godzin, minut, sekund i milisekund w dniu 1, wykonaj następujące czynności:

date1.setHours(0,0,0,0)

Teraz możesz porównywać dwie daty jako DATY tylko bez obawy o elementy czasu.


63
Należy pamiętać, że testowanie przez date1 === date2wydaje się nie zapewniać spójnego zachowania; lepiej to zrobić, date1.valueOf() === b.valueOf()a nawet date1.getTime() === date2.getTime(). Osobliwość.
Erwin Wessels

4
Bądź ostrożny: jeśli data1 i data2 są zimą i latem, a planujesz iterację z addDays (1), problem polega na tym, że nie będą miały tej samej strefy czasowej z powodu czasu letniego, więc ostatni porównanie, które powinno dać równe daty, nie zadziała, ponieważ dwie daty nie są tak naprawdę o 00: 00: 00: 0.
Oliver

9
Wiem, że to stare pytanie, ale najpierw pojawia się w Google podczas wyszukiwania. Uważaj z tą odpowiedzią. To da niepoprawne odpowiedzi, jeśli użytkownik nie znajduje się w tej samej strefie czasowej, co twórca obiektu daty. Na przykład zmień strefę czasową w systemie operacyjnym komputera na czas wschodniego wybrzeża (USA). Otwórz konsolę przeglądarki i wpisz var date2 = new Date(2011,8,20). Teraz zmień strefę czasową systemu operacyjnego na czas pacyficzny (USA). W tym samym rodzaju konsoli przeglądarki, date2.toDateString()a wrócisz Mon Sep 19 2011zamiast wtorku 20!
Adam,

9
Należy również pamiętać, że setHours()ustawia czas na podstawie bieżącej strefy czasowej, która jest automatycznie wykrywana przez przeglądarkę. Spróbuj: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());wydrukuje "2016-02-28T15:00:00.000Z", data 28, ale nie 29 Moja aktualna strefa czasowa toAsia/Tokyo
przetłumacz

8
Ta odpowiedź naprawdę powinna zostać zaktualizowana, aby używać setUTCxxxmetod zamiast wariantów rozpoznających lokalną strefę czasową.
Stijn de Witt

136

Uważaj na strefę czasową

Używanie obiektu date do natychmiastowego przedstawienia tylko daty, powoduje ogromny problem z nadmierną precyzją. Musisz zarządzać czasem i strefą czasową, aby je trzymać, a oni mogą wrócić na każdym kroku. Przyjęta odpowiedź na to pytanie wpada w pułapkę.

Data javascript nie ma pojęcia strefy czasowej . Jest to chwila (tyka od epoki) z przydatnymi (statycznymi) funkcjami do tłumaczenia na i z ciągów, domyślnie wykorzystując „lokalną” strefę czasową urządzenia lub, jeśli określono, UTC lub inną strefę czasową. Aby reprezentować just-a-date ™ za pomocą obiektu daty, 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 zachować czujność, aby zarządzać pojęciem strefy czasowej, zarówno podczas tworzenia obiektu o północy według czasu UTC, jak i podczas serializowania go.

Wielu ludzi jest zdezorientowanych domyślnym zachowaniem konsoli. Jeśli natryskasz datę na konsolę, zobaczysz, że wynik będzie zawierać strefę czasową. Wynika to tylko z tego, że konsola dzwoni toString()w twoim dniu i toString()zapewnia lokalną reprezentację. Data bazowa nie ma strefy czasowej ! (Dopóki czas odpowiada przesunięciu strefy czasowej, nadal masz obiekt o północy czasu UTC)

Deserializacja (lub tworzenie obiektów o północy UTC)

Jest to krok zaokrąglania, z tą sztuczką, że istnieją dwie „właściwe” odpowiedzi. 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Deserializuj datę

Często daty na drucie będą miały format RRRR-MM-DD. Aby deserializować je, zrób to ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Serializacja

Mając na uwadze zarządzanie strefą czasową podczas tworzenia, musisz teraz 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()

Aby odpowiedzieć na twoje pytanie, 7 lat za późno ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Zobacz, jak działa ...

Aktualizacja 2019 ... darmowe rzeczy ...

Biorąc pod uwagę popularność tej odpowiedzi, umieściłem to wszystko w kodzie. Poniższa funkcja zwraca zawinięty obiekt daty i ujawnia tylko te funkcje, których można bezpiecznie używać z funkcją just-a-date ™.

Zadzwoń do niego z obiektem Date, a rozwiąże to JustADate odzwierciedlające strefę czasową użytkownika. Nazwij to ciągiem znaków: jeśli ciąg znaków to ISO 8601 z określoną strefą czasową, po prostu zaokrąglimy część czasu. Jeśli strefa czasowa nie zostanie określona, ​​przekonwertujemy ją na datę odzwierciedlającą lokalną strefę czasową, tak jak w przypadku obiektów daty.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
Twoja odpowiedź zawiera naprawdę cenne informacje! Niestety, tak naprawdę nie dodałeś odpowiedzi do rzeczywistego pytania OP, co uniemożliwiło mi jej poprawienie. Spróbuj dodać mały fragment kodu, który odpowiada na pytanie OP.
Stijn de Witt

Ha ha ha @ „7 lat za późno”! Podoba mi się twój styl użytkownika1585345! Masz mój głos!
Stijn de Witt

Uznałem to za pomocne. Pamiętaj, że we fragmencie „międzynarodowej porównywalności” występuje literówka. Myślę, że powinien to być: new Date (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak

1
Chciałbym móc głosować tę odpowiedź 100 razy !!!
Sнаđошƒаӽ

77

Co powiesz na to?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Umożliwia porównanie części daty w ten sposób bez wpływu na wartość zmiennej:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

To zdecydowanie najbardziej elegancka odpowiedź na oryginalny post. Nie stworzyłem osobnej funkcji dla moich celów, po prostu zawierałem dwa wiersze kodu.
Danimal Reks

25

Korzystanie z Moment.js

Jeśli masz opcję dołączenia biblioteki innej firmy, zdecydowanie warto zajrzeć na Moment.js . Ułatwia to pracę Datei jest DateTimeo wiele łatwiejszy.

Na przykład, sprawdzając, czy jedna Data przychodzi po innej Dacie, ale z wyłączeniem ich czasów, zrobiłbyś coś takiego:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Drugi parametr przekazać do isAfterjest precyzja zrobić porównanie i może być dowolny year, month, week, day, hour, minutelub second.


4
otrzymałem 100-krotne przyspieszenie przejścia z rozwiązania momentjs do rozwiązania Date () + sethours. ostrożni przyjaciele :-)
2c2c,

@ 2c2c Ciekawe. Zdecydowanie dobrze jest znać wpływ na wydajność. Ile operacji wykorzystałeś do swojego testu porównawczego?
Joshua Pinter,

1
miałem około 1 mila porównań. nie ustawiłem rzeczywistego testu porównawczego
2c2c,

17

Po prostu porównaj używając .toDateString jak poniżej:

new Date().toDateString();

Spowoduje to zwrócenie tylko części daty, a nie godziny lub strefy czasowej, jak poniżej:

„Pt 03 lutego 2017 r.”

Dlatego obie daty można porównać w tym formacie również bez części czasowej.


2
To dobry początek, ale nie pozwoli na porównania, ponieważ jest to teraz ciąg. Aby porównać, zmień go z powrotem na obiekt Date, wykonując new Date(new Date().toDateString());
Grid Trekkor

@GridTrekkor Prawda, ale jeśli chcesz tylko szybkiego testu równości, jest to najprostsze rozwiązanie.
CM

8

Może to być nieco czystsza wersja, należy również pamiętać, że zawsze należy używać podstawki podczas używania parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

Zapoznaj się ze stroną analizy składni MDC, aby uzyskać więcej informacji o podstawce.

JSLint to świetne narzędzie do przechwytywania brakujących podstaw i wielu innych rzeczy, które mogą powodować niejasne i trudne do debugowania błędy. Zmusza Cię do korzystania z lepszych standardów kodowania, aby uniknąć przyszłych bólów głowy. Używam go w każdym kodzie projektu JavaScript.


@EmKay To nie powinno być tak dużym problemem, ponieważ ES5 jest dość standardem w większości przeglądarek i zabrania interpretacji ósemkowej, ALE niektóre przeglądarki mogą nadal używać starej interpretacji ósemkowej ze względu na kompatybilność wsteczną, więc nadal będę używać radix w dającej się przewidzieć przyszłości.
Bezużyteczny kod

Jeśli użyjesz trybu ścisłego, interpretacje ósemkowe będą generować błędy, co jest dobre, ponieważ pomaga znaleźć błędy, które mogą być źle interpretowane.
Bezużyteczny kod


4

Jeśli naprawdę porównujesz datę tylko bez komponentu czasu, innym rozwiązaniem, które może wydawać się błędne, ale działa i pozwala uniknąć Date()problemów związanych z czasem i strefą czasową, jest bezpośrednie porównanie daty ciągu ISO za pomocą porównania ciągu:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Możesz uzyskać bieżącą datę (datę UTC, niekoniecznie datę lokalną użytkownika), używając:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Moim argumentem przemawiającym za tym jest prostota programisty - znacznie mniej prawdopodobne jest, że będziesz się tym przejmował niż próba poprawnego zarządzania czasami i przesunięciami danych, prawdopodobnie kosztem szybkości (nie porównałem wydajności)


Możesz też zrobić new Date().toISOString().substr(0, 10) // "2019-04-22".
stomy

W przypadku lokalnej daty (data poza UTC) możesz użyć new Date().toLocaleDateString() // "8/26/2019". Ale porównanie tekstu nie będzie dokładne (jak "8/26/2019" >= "9/29/2001"fałsz). Musisz go przekonwertować, new Date(new Date().toLocaleDateString())aby dokładnie porównać z inną datą.
stomy

4

Wystarczy użyć toDateString () w obu datach. toDateString nie obejmuje czasu, więc dla 2 razy tego samego dnia wartości będą równe, jak pokazano poniżej.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

Oczywiście niektóre obawy dotyczące strefy czasowej wyrażone gdzie indziej w tym pytaniu są ważne, ale w wielu scenariuszach nie są one istotne.


1
W moim przypadku to rozwiązanie jest znacznie lepsze niż wybrana odpowiedź i więcej głosowanych odpowiedzi. Jest to wyraźnie powiedziane w tytule „bez porównywania czasu”, to rozwiązanie robi to dokładnie, oszczędzając konieczności ustawiania czasu na manipulowanie porównaniem. Aby odpowiedzieć „Czy zdarzenie X i zdarzenie Y miały miejsce tego samego dnia”, bardziej sensowne jest porównanie samej daty, niż odpowiedzieć „Czy 00: 00: 00.00 AM daty zdarzenia X jest dokładnie takie samo jak 00:00: 00.00 daty zdarzenia Y? ” to właśnie robi wielu innych użytkowników
Mr.K

3

Tak to robię:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}

Obecnie używam tego w produkcji i nie mam żadnego problemu lub niezgodności przeglądarki itp. ... żadnych powodów, dla których mówisz, że getTime()jest to wymagane?
Fabrizio,

5
Należy pamiętać, że setHours()modyfikuje obiekt, do którego jest wywoływany, i zwraca datę jako liczbę milisekund (równoważną wywołaniu getTime()). Dlatego twoja todayzmienna nie jest Dateobiektem, którego niektórzy by się spodziewali, ale w rzeczywistości jest liczbą całkowitą milisekund. Efektem ubocznym jest to, że nie musiałeś dzwonić getTime()przed porównaniem, ponieważ masz już w niejasny sposób.
Timothy Walters

3

Ponieważ nie widzę tutaj podobnego podejścia i nie lubię ustawiać h / m / s / ms na 0, ponieważ może to powodować problemy z dokładnym przejściem do lokalnej strefy czasowej ze zmienionym dateobiektem (zakładam, że tak), pozwól mi przedstaw tutaj, napisane kilka chwil temu, funkcję lil:

+: Łatwy w użyciu, wykonuje podstawowe operacje porównywania (porównywanie dnia, miesiąca i roku bez czasu.)
-: Wydaje się, że jest to całkowite przeciwieństwo myślenia „po wyjęciu z pudełka”.

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Stosowanie:

datecompare(date1, '===', date2)dla kontroli równości,
datecompare(date1, '>', date2)dla większej kontroli,
!datecompare(date1, '>', date2)dla mniejszej lub równej kontroli

Ponadto, oczywiście, można przełączać date1i date2w miejscach, w celu osiągnięcia jakiegokolwiek innego porównania proste.


Miły plus plus pomógł mi, teraz mam nadzieję, że konwersje ISO nie gryzą, haha, dzięki.
edencorbin

3

Skutecznym i poprawnym sposobem porównywania dat jest:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Ignoruje część czasu, działa w różnych strefach czasowych, a także możesz porównać dla równości ==. 86400000 to liczba milisekund w ciągu dnia ( = 24*60*60*1000).

Uwaga: operator równości nigdy nie== powinien być używany do porównywania obiektów Date, ponieważ kończy się niepowodzeniem, gdy można oczekiwać, że zadziała test równości, ponieważ porównuje dwa obiekty Date (i nie porównuje dwóch dat), np .:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Uwagi: Jeśli porównujesz obiekty Date, dla których część czasu jest ustawiona na zero, możesz użyć, date1.getTime() == date2.getTime()ale nie jest to warte optymalizacji. Można użyć <, >, <=lub >=przy porównywaniu Data obiektów bezpośrednio, ponieważ te podmioty najpierw przekonwertować obiekt Date wywołując .valueOf()zanim operator ma porównania.


2

Po przeczytaniu tego pytania w tym samym czasie po jego opublikowaniu postanowiłem opublikować inne rozwiązanie, ponieważ nie uznałem go za całkiem satysfakcjonujące, przynajmniej według moich potrzeb:

Użyłem czegoś takiego:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

W ten sposób mogłem wykorzystać daty w formacie, który chciałem później przetworzyć. Ale to było tylko na moją potrzebę, ale i tak zdecydowałem się opublikować, może to komuś pomoże


1
Pamiętaj, że twoja currentDatezmienna nie jest datą, to liczba milisekund od 1970-01-01. Te setHours()metoda modyfikuje object data jest nazywany dalej, i zwraca odpowiednik getTime()(wartości daty w milisekundach od 1970-01-01).
Timothy Walters

1

Upewnij się, że budujesz userDatez 4-cyfrowym rokiem jak setFullYear(10, ...) !== setFullYear(2010, ...).


1

Możesz użyć pewnej arytmetyki z sumą ms.

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

Podoba mi się to, ponieważ nie są wykonywane żadne aktualizacje pierwotnych dat i perfom są szybsze niż dzielenie łańcucha i porównywanie.

Mam nadzieję, że to pomoże!


1

Ten JS zmieni treść po ustawionej dacie , to samo, ale w w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

To działa dla mnie:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

W zaakceptowanej odpowiedzi występuje problem strefy czasowej, a innym razem nie jest to 00:00:00


0

Wiem, że na to pytanie już udzielono odpowiedzi i może nie jest to najlepszy sposób, ale w moim scenariuszu działa idealnie, więc pomyślałem, że może pomóc komuś podobnemu do mnie.

jeśli masz date stringjak

String dateString="2018-01-01T18:19:12.543";

i chcesz po prostu porównać część daty z innym obiektem Date w JS,

var anotherDate=new Date(); //some date

potem trzeba do obiektu za pomocąconvertstringDatenew Date("2018-01-01T18:19:12.543");

i oto sztuczka: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Użyłem toDateString()z Date objectJS, która zwraca tylko data łańcuch.

Uwaga: Nie zapomnij użyć .valueOf()funkcji podczas porównywania dat.

Więcej informacji o .valeOf()jest tu odniesienie

Szczęśliwego kodowania.


0

To pomoże. Udało mi się to uzyskać w ten sposób.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

Porównanie setHours()będzie rozwiązaniem. Próba:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

jeśli twój format daty jest inny, użyj biblioteki moment.js, aby przekonwertować format daty, a następnie użyj powyższego kodu, aby porównać dwie daty

Przykład:

Jeśli Twoja data to „DD / MM / RRRR” i chcesz ją przekonwertować na „MM / DD / RRRR”, zobacz poniższy przykład kodu

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.