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.
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.
Odpowiedzi:
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.
setHours(0,0,0,0)
ten sposób. Eliminuje potrzebę dzwonienia setMinutes()
itp. Ponadto działa szybciej.
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?
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ę:
date.inRange (d, początek, koniec)
Zwraca wartość logiczną lub NaN:
date.convert
Używany przez inne funkcje do konwersji danych wejściowych na obiekt daty. Dane wejściowe mogą być
.
// 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
);
}
}
(a > b) - (a < b)
przydaje się do sortowania tablicy dat
Array.prototype.sort
warunkiem, ż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; }
return a - b
jest prostszy i zastępuje całą instrukcję return.
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!
x.getTime() === y.getTime()
metodę, zarówno czytelną, jak i bardzo szybką, zobacz jsperf
+
Operator próbuje przekształcić wyrażenie do liczby. Date.valueOf()
służy do konwersji (który powraca to samo, co Date.getTime()
.
<
, <=
, >
I >=
korzystać z tego samego algorytmu ( abstrakcyjny algorytm porównania relacyjny ) za kulisy.
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 Number
funkcja, jak i +
operator jednoargumentowy wywołują valueOf()
metody za kulisami.
Thursday, 10 Aug 2017
jest niestandardowym formatem i różne przeglądarki mogą go analizować inaczej lub w ogóle go nie analizować. Zobacz uwagi na temat Date.parse
.
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);
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 Object
je 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
<
, >
, <=
, >=
) 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
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
}
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
==
wspomnianego wyżej problemu porównania.
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
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
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
wszystko, co musisz zrobić, to przekazać dowolny z tych formatów spacyfikowanych w js
pliku biblioteki
Prostym sposobem jest
var first = '2012-11-21';
var second = '2012-11-03';
if (new Date(first) > new Date(second) {
.....
}
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.
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
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.
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 dateTimeA
jest większa niżdateTimeB
Metoda zwraca 0, jeśli dateTimeA
jest równadateTimeB
Metoda zwraca -1, jeśli dateTimeA
jest mniejsza niżdateTimeB
Date
obiektów.
<
lub >
operatorów, gdy chwila już przychodzi z przydatnymi metodami porównywania, takimi jak .isBefore
i .isAfter
, wszystko to jest w dokumentacji
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()
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.
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).
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;
}
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));
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 20121121
liczba jest większa, 20121103
czy nie.
first == second
lub first < second
lub 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.
Zwykle przechowuję Dates
jak 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ść.
var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp
var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);
Przed porównaniem Dates
obiektu spróbuj ustawić obie ich milisekundy na zero Date.setMilliseconds(0);
.
W niektórych przypadkach, gdy Date
obiekt 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.
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
d1==d2
(D) i d1===d2
(E) są najszybsze dla wszystkich przeglądarekgetTime
(A) jest szybsze niż valueOf
(B) (oba są średnio szybkie)Poniżej przedstawione są fragmenty kodu zastosowane w testach wydajności. Test możesz wykonać na swoim urządzeniu TUTAJ
Wyniki dla chrome
d1==d2
lub d1===d2
jest bezużyteczny w kontekście pytania.
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
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;
}
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.