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?
źródło
date1 === date2
wydaje się nie zapewniać spójnego zachowania; lepiej to zrobić,date1.valueOf() === b.valueOf()
a nawetdate1.getTime() === date2.getTime()
. Osobliwość.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óciszMon Sep 19 2011
zamiast wtorku 20!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
setUTCxxx
metod zamiast wariantów rozpoznających lokalną strefę czasową.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 itoString()
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 ...
Czasami międzynarodowa porównywalność przewyższa lokalną dokładność. W takim przypadku zrób to ...
Deserializuj datę
Często daty na drucie będą miały format RRRR-MM-DD. Aby deserializować je, zrób to ...
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 ...
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.
źródło
Co powiesz na to?
Umożliwia porównanie części daty w ten sposób bez wpływu na wartość zmiennej:
źródło
Korzystanie z Moment.js
Jeśli masz opcję dołączenia biblioteki innej firmy, zdecydowanie warto zajrzeć na Moment.js . Ułatwia to pracę
Date
i jestDateTime
o 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:
Drugi parametr przekazać do
isAfter
jest precyzja zrobić porównanie i może być dowolnyyear
,month
,week
,day
,hour
,minute
lubsecond
.źródło
Po prostu porównaj używając .toDateString jak poniżej:
Spowoduje to zwrócenie tylko części daty, a nie godziny lub strefy czasowej, jak poniżej:
Dlatego obie daty można porównać w tym formacie również bez części czasowej.
źródło
new Date(new Date().toDateString());
Może to być nieco czystsza wersja, należy również pamiętać, że zawsze należy używać podstawki podczas używania parseInt.
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.
źródło
Date.js biblioteka jest przydatny dla tych rzeczy. To sprawia, że wszystkie operacje związane z datowaniem JS są znacznie łatwiejsze.
źródło
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:Możesz uzyskać bieżącą datę (datę UTC, niekoniecznie datę lokalną użytkownika), używając:
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)
źródło
new Date().toISOString().substr(0, 10) // "2019-04-22"
.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ą.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.
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.
źródło
Tak to robię:
źródło
getTime()
jest to wymagane?setHours()
modyfikuje obiekt, do którego jest wywoływany, i zwraca datę jako liczbę milisekund (równoważną wywołaniugetTime()
). Dlatego twojatoday
zmienna nie jestDate
obiektem, 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.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
date
obiektem (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”.Stosowanie:
datecompare(date1, '===', date2)
dla kontroli równości,datecompare(date1, '>', date2)
dla większej kontroli,!datecompare(date1, '>', date2)
dla mniejszej lub równej kontroliPonadto, oczywiście, można przełączać
date1
idate2
w miejscach, w celu osiągnięcia jakiegokolwiek innego porównania proste.źródło
Skutecznym i poprawnym sposobem porównywania dat jest:
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 .: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.źródło
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:
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
źródło
currentDate
zmienna nie jest datą, to liczba milisekund od 1970-01-01. TesetHours()
metoda modyfikuje object data jest nazywany dalej, i zwraca odpowiednikgetTime()
(wartości daty w milisekundach od 1970-01-01).Upewnij się, że budujesz
userDate
z 4-cyfrowym rokiem jaksetFullYear(10, ...) !== setFullYear(2010, ...)
.źródło
Możesz użyć pewnej arytmetyki z sumą ms.
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!
źródło
Ten JS zmieni treść po ustawionej dacie , to samo, ale w w3schools
źródło
To działa dla mnie:
W zaakceptowanej odpowiedzi występuje problem strefy czasowej, a innym razem nie jest to 00:00:00
źródło
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 string
jaki chcesz po prostu porównać część daty z innym obiektem Date w JS,
potem trzeba do obiektu za pomocą
convert
string
Date
new Date("2018-01-01T18:19:12.543");
i oto sztuczka: -
Użyłem
toDateString()
zDate object
JS, 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 odniesienieSzczęśliwego kodowania.
źródło
To pomoże. Udało mi się to uzyskać w ten sposób.
źródło
Porównanie
setHours()
będzie rozwiązaniem. Próba:źródło
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
źródło
Możesz użyć fp_incr (0). Co ustawia część strefy czasowej na północ i zwraca obiekt daty.
źródło