Может кто-нибудь предложить способ сравнения значений двух дат больше, меньше, а не в прошлом с использованием JavaScript? Значения будут поступать из текстовых полей.
Может кто-нибудь предложить способ сравнения значений двух дат больше, меньше, а не в прошлом с использованием JavaScript? Значения будут поступать из текстовых полей.
Ответы:
Объект Дата будет делать то , что вы хотите - конструкт один на каждую дату, а затем сравнить их с помощью >
, <
, <=
или >=
.
==
, !=
, ===
, И !==
операторы требуют использовать date.getTime()
как в
var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();
чтобы быть понятным, просто проверка на равенство непосредственно с объектами даты не будет работать
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)
Тем не менее, я предлагаю вам использовать выпадающие списки или какую-то похожую ограниченную форму ввода даты, а не текстовые поля, чтобы не оказаться в аду проверки ввода.
setHours(0,0,0,0)
так. Устраняет необходимость вызова setMinutes()
и т. Д. Кроме того, выполняется быстрее.
toString()
метод в обе даты, а затем сравнить с ==
оператором? Кажется, намного проще, чем сбрасывать время и сравнивать потом, есть ли недостатки для этого?
Самый простой способ сравнить даты в javascript - сначала преобразовать его в объект Date, а затем сравнить эти объекты date.
Ниже вы найдете объект с тремя функциями:
dates.compare (а, б)
Возвращает число:
date.inRange (d, начало, конец)
Возвращает логическое значение или NaN:
dates.convert
Используется другими функциями для преобразования их ввода в объект даты. Ввод может быть
,
// 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)
полезно для сортировки массива дат
Array.prototype.sort
условии, что все значения являются действительными датами. Если могут быть недействительные даты, я рекомендую использовать что-то вродеfunction ( 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
проще и заменяет весь оператор return.
Сравните <
и >
как обычно, но все, что связано, =
должно использовать +
префикс. Вот так:
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
Надеюсь это поможет!
x.getTime() === y.getTime()
метод, как читабельный, так и очень быстрый, см. jsperf
+
Оператор пытается преобразовать выражение в номер. Date.valueOf()
используется для преобразования (которое возвращает то же самое, что и Date.getTime()
.
<
, <=
, >
И >=
использовать тот же алгоритм ( абстрактный алгоритм относительного сравнения ) за кулисами.
Реляционные операторы <
<=
>
>=
могут использоваться для сравнения дат 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
Однако операторы равенства ==
!=
===
!==
не могут быть использованы для сравнения (значения) дат, потому что :
- Два разных объекта никогда не равны ни для строгих, ни для абстрактных сравнений.
- Выражение, сравнивающее Объекты, истинно, только если операнды ссылаются на один и тот же Объект.
Вы можете сравнить значение дат на равенство, используя любой из этих методов:
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
Оба Date.getTime()
и Date.valueOf()
возвращают количество миллисекунд с 1 января 1970 года, 00:00 UTC. И Number
функция, и унарный +
оператор вызывают valueOf()
методы за сценой.
Thursday, 10 Aug 2017
это нестандартный формат, и разные браузеры могут анализировать его по-разному или не анализировать вообще. Смотрите заметки на Date.parse
.
Безусловно, самый простой способ - вычесть одну дату из другой и сравнить результат.
var oDateOne = new Date();
var oDateTwo = new Date();
alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);
Сравнение дат в JavaScript довольно просто ... В JavaScript есть встроенная система сравнения дат, которая делает сравнение таким простым ...
Просто выполните следующие шаги для сравнения значения 2 дат, например, у вас есть 2 входа, каждый из которых имеет значение даты, String
и вы можете сравнить их ...
1. у вас есть 2 строковых значения, которые вы получаете из входных данных, и вы хотите сравнить их, как показано ниже:
var date1 = '01/12/2018';
var date2 = '12/12/2018';
2. Их нужно Date Object
сравнивать как значения даты, поэтому просто конвертируйте их в дату, используя new Date()
, я просто переназначаю их для простоты объяснения, но вы можете сделать это в любом случае:
date1 = new Date(date1);
date2 = new Date(date2);
3. Теперь просто сравните их, используя>
<
>=
<=
date1 > date2; //false
date1 < date2; //true
date1 >= date2; //false
date1 <= date2; //true
<
, >
, <=
, >=
) используется, дата объекты преобразуются первым в UNIX эпохи ( в секундах), и он работает отлично. Однако это может привести к распространенной ошибке, date1 == date2
когда действительно вводится ошибка, поскольку проверяется не равенство, а значение. Чтобы предотвратить это и проверить равенство значения даты, это сработало бы: date1.valueOf() == date2.valueOf()
или корочеdate1+0 == date2+0
Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies.
и Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
Сравнить только день (без учета компонента времени):
Date.prototype.sameDay = function(d) {
return this.getFullYear() === d.getFullYear()
&& this.getDate() === d.getDate()
&& this.getMonth() === d.getMonth();
}
Применение:
if(date1.sameDay(date2)) {
// highlight day on calendar or something else clever
}
какой формат?
Если вы создаете объект Javascript Date , вы можете просто вычесть их, чтобы получить разницу в миллисекунды (отредактируйте или просто сравните их):
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
==
проблемы сравнения, упомянутой выше.
Вы используете этот код,
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");
}
А также проверьте эту ссылку http://www.w3schools.com/js/js_obj_date.asp
КОРОТКИЙ ОТВЕТ
Вот функция, которая возвращает {boolean}, если от dateTime> до dateTime Demo в действии
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
объяснение
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
так как теперь у вас есть оба datetime в числовом типе, вы можете сравнить их с любыми операциями сравнения
(>, <, =,! =, ==,! ==,> = AND <=)
затем
Если вы знакомы с C#
пользовательской строкой формата даты и времени, эта библиотека должна делать то же самое и помогать форматировать дату и время в формате dtmFRM независимо от того, передаете ли вы строку даты или времени или формат Unix.
Применение
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
все, что вам нужно сделать, это передать любой из этих форматов в js
файл библиотеки
Простой способ,
var first = '2012-11-21';
var second = '2012-11-03';
if (new Date(first) > new Date(second) {
.....
}
Примечание - Сравнить только часть даты:
Когда мы сравниваем две даты в JavaScript. Это также учитывает часы, минуты и секунды. Так что, если нам нужно только сравнить только дату, это подход:
var date1= new Date("01/01/2014").setHours(0,0,0,0);
var date2= new Date("01/01/2014").setHours(0,0,0,0);
Теперь: if date1.valueOf()> date2.valueOf()
будет работать как шарм.
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
Просто чтобы добавить еще одну возможность ко многим существующим опциям, вы можете попробовать:
if (date1.valueOf()==date2.valueOf()) .....
... что, кажется, работает для меня. Конечно, вы должны убедиться, что обе даты не определены ...
if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....
Таким образом, мы можем обеспечить положительное сравнение, если оба они тоже не определены, или ...
if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....
... если вы предпочитаете, чтобы они не были равны.
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"));
Метод возвращает 1, если dateTimeA
больше чемdateTimeB
Метод возвращает 0, если dateTimeA
равноdateTimeB
Метод возвращает -1, если dateTimeA
меньшеdateTimeB
Date
объектам.
<
или, >
если момент уже наступает с удобными методами сравнения, такими как .isBefore
и .isAfter
, это все в документах
ОСТЕРЕГАЙТЕСЬ ВРЕМЕНИ
Дата в JavaScript не имеет понятия о часовом поясе . Это момент времени (тики начиная с эпохи) с удобными функциями для перевода в и из строк в «местном» часовом поясе. Если вы хотите работать с датами, используя объекты даты, как это делают все здесь, вы хотите , чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты.Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от сезона или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, особенно когда вы создаете свой объект UTC Date.
В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения . Пользователи в Новой Зеландии и США нажимают одновременно и получают разные даты. В таком случае сделай это ...
// 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()));
Иногда международная сопоставимость превосходит локальную точность. В таком случае сделай это ...
// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));
Теперь вы можете напрямую сравнивать объекты даты, как предлагают другие ответы.
Позаботившись об управлении часовым поясом при создании, вы также должны быть уверены, что часовой пояс не будет отображаться при преобразовании обратно в строковое представление. Так что вы можете смело использовать ...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
И полностью избегать всего остального, особенно ...
getYear()
, getMonth()
,getDate()
Для сравнения двух дат мы можем использовать библиотеку JavaScript date.js, которую можно найти по адресу: https://code.google.com/archive/p/datejs/downloads
и использовать Date.compare( Date date1, Date date2 )
метод, и он возвращает число, которое означает следующий результат:
-1 = дата1 меньше даты2.
0 = значения равны.
1 = дата1 больше даты2.
Для того, чтобы создавать даты из свободного текста в Javascript, вам нужно разобрать его в объект Date ().
Вы можете использовать Date.parse (), который использует свободный текст, пытается преобразовать его в новую дату, но если у вас есть контроль над страницей, я бы рекомендовал вместо этого использовать поля выбора HTML или средство выбора даты, такое как элемент управления календаря YUI или пользовательский интерфейс jQuery. DatePicker .
Как только у вас есть дата, как указали другие люди, вы можете использовать простую арифметику, чтобы вычесть даты и преобразовать их обратно в число дней, разделив число (в секундах) на количество секунд в дне (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;
}
Улучшенная версия кода, размещенная "некоторыми"
/* 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
);
};
Применение:
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));
Если следующий формат даты, вы можете использовать этот код:
var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
//...
}
Он проверит, 20121121
больше 20121103
или нет число.
first == second
или first < second
или first > second
. Это одна из многих красот с ISO8601 по сравнению с ММ / ДД / ГГ, ДД / ММ / ГГ, ГГ / ДД / ММ, ДД / ГГ / ММ или ММ / ГГ / ДД.
Я обычно храню Dates
как timestamps(Number)
в базах данных.
Когда мне нужно сравнить, я просто сравниваю среди этих временных меток или
преобразовать его в Date Object, а затем сравнить с > <
при необходимости.
Обратите внимание, что == или === не работает должным образом, если ваши переменные не являются ссылками на один и тот же объект Date.
Сначала преобразуйте эти объекты Date в отметку времени (число), а затем сравните их равенство.
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);
Прежде чем сравнивать Dates
объект, попробуйте установить обе их миллисекунды равными нулю Date.setMilliseconds(0);
.
В некоторых случаях, когда Date
объект динамически создается в javascript, если вы продолжите печатать Date.getTime()
, вы увидите изменение миллисекунд, что помешает равенству обеих дат.
Сегодня 2020.02.27 я выполняю тесты выбранных решений на Chrome v80.0, Safari v13.0.5 и Firefox 73.0.1 на MacOs High Sierra v10.13.6
d1==d2
(D) и d1===d2
(E) являются самыми быстрыми для всех браузеровgetTime
(A) быстрее, чем valueOf
(B) (оба являются средне-быстрыми)Ниже представлены решения с фрагментами, используемые в тестах производительности. Вы можете выполнить тест на вашей машине ЗДЕСЬ
Результаты для хрома
d1==d2
или d1===d2
бесполезен в контексте вопроса.
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.
Спасибо Д.Джеева
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;
}
Вот что я сделал в одном из моих проектов,
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;
}
}
называя это на форме на представлении. надеюсь это поможет.