Я хотел бы сравнить две даты в javascript. Я провел некоторое исследование, но все, что я могу найти, - это как вернуть текущую дату. Я хочу сравнить 2 отдельные даты, не относящиеся к сегодняшнему дню. Как я это сделал.
var startDate = Date(document.form1.Textbox2);



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


if (date1.getTime() > date2.getTime()) {
alert("The first date is after the second date!");
}
надеюсь, это поможет comptechdoc.org/independent/web/cgi/javamanual/javadate.html
Похоже, что Chrome и Firefox поддерживают date1 > date2, то есть без части getTime (). Кто-нибудь знает о других браузерах?
@Linus Я бы не стал доверять реализации, чтобы сделать это правильно. Лучше перестраховаться, чем сожалеть, да?
@JonathanDumaine Согласен, подумал, что это выглядит намного лучше :)
ValueOf более надежен
Вы можете использовать метод getTime () для объекта Date, чтобы получить отметку времени (в миллисекундах) относительно 1 января 1970 года. Если вы конвертируете две даты в целочисленные отметки времени, вы можете затем сравнить разницу, вычитая их. Результат будет в миллисекундах, поэтому вы просто разделите на 1000 для секунд, затем на 60 для минут и т. д.
Даты JavaScript можно сравнивать с помощью тех же операторов сравнения, которые используют остальные типы данных:>, <, <=,> =, ==,! =, ===,! ==.
Если у вас есть две даты A и B, то A <B, если A уходит в прошлое дальше, чем B.
Но похоже, что у вас проблемы с превращением струны в свидание. Вы делаете это, просто передавая строку в качестве аргумента для новой даты:
var someDate = new Date("12/03/2008");
или, если нужная строка является значением поля формы, как кажется:
var someDate = new Date(document.form1.Textbox2.value);
Если эта строка не является чем-то, что JavaScript распознает как дату, вы все равно получите объект Date, но он будет «недействительным». Любое сравнение с другой датой вернет false. При преобразовании в строку она станет «недействительной датой». Его функция getTime () вернет NaN, а вызов isNaN () для самой даты вернет true; это простой способ проверить, является ли строка действительной датой.
что произойдет, если строка не может быть проанализирована до даты?
Тогда вы все равно получите объект Date, но он недействителен. Любое сравнение с другой датой вернет false. Его функция getTime () вернет NaN, а вызов isNaN () для самой даты вернет true. При преобразовании в строку она станет «недействительной датой».
Это не работает с == (по крайней мере, в firefox). Прямое сравнение двух дат всегда возвращает false, вы должны использовать getTime (), как упоминалось выше.
В Visual Studio 2010 отладчик javascript: ?(new Date('1995-02-04T24:00') == new Date('1995-02-05T00:00')); false, но ?(new Date('1995-02-04T24:00').getTime() == new Date('1995-02-05T00:00').getTime()); true
'===' сравнивает ссылки на объекты и работать не будет.
new Date («12/1/2015»)! == new Date («12/1/2015»), поэтому утверждение, что вы сравниваете даты JavaScript, такие как «остальные типы данных», в лучшем случае вводит в заблуждение. Проголосовали против.
==,! =, ===,! === не работают. Также нет оператора! ===.
ни один из этих операторов не должен работать. Поскольку дата является сложным типом, == сравнивает значение, в данном случае ссылку на экземпляр созданной даты. === сравнивает тип и ссылку.
@eggmatters на самом деле >, <, <= и >= действительно работают для сравнения дат.
@Isak Это потому, что новая дата ("13/1/2015") возвращает недопустимую дату -_-
Я бы предпочел использовать метод Date valueOf вместо === или! ==
Похоже, что === сравнивает внутренние ссылки на объекты и ничего не касается даты.
Вы можете попробовать добавить следующий код сценария, чтобы реализовать это:
if (CompareDates(smallDate,largeDate,'-') == 0) {
alert('Selected date must be current date or previous date!');
return false;
}
function CompareDates(smallDate,largeDate,separator) {
var smallDateArr = Array();
var largeDateArr = Array();
smallDateArr = smallDate.split(separator);
largeDateArr = largeDate.split(separator);
var smallDt = smallDateArr[0];
var smallMt = smallDateArr[1];
var smallYr = smallDateArr[2];
var largeDt = largeDateArr[0];
var largeMt = largeDateArr[1];
var largeYr = largeDateArr[2];
if (smallYr>largeYr)
return 0;
else if (smallYr<=largeYr && smallMt>largeMt)
return 0;
else if (smallYr<=largeYr && smallMt==largeMt && smallDt>largeDt)
return 0;
else
return 1;
}
new Date('1945/05/09').valueOf() < new Date('2011/05/09').valueOf()
работает нормально спасибо
@VladimirShmidt: не будет работать в firefox.
@AjayBarot проверил, хорошо ли работает в последней версии FireFox.
Вы можете попробовать этот код для проверки того, какое значение даты является наибольшим из двух дат в формате ММ / ДД / ГГГГ:
function d_check() {
var dl_sdt=document.getElementIdBy("date_input_Id1").value; //date one
var dl_endt=document.getElementIdBy("date_input_Id2").value; //date two
if ((dl_sdt.substr(6,4)) > (dl_endt.substr(6,4))) {
alert("first date is greater");
return false;
}
else if ((((dl_sdt.substr(0,2)) > (dl_endt.
substr(0,2)))&&(frdt(dl_sdt.substr(3,2)) > (dl_endt.substr(3,2))))||
(((dl_sdt.substr(0,2)) > (dl_endt.substr(0,2)))&&
((dl_sdt.substr(3,2)) < (dl_endt.substr(3,2))))||
(((dl_sdt.substr(0,2)) == (dl_endt.substr(0,2)))&&((dl_sdt.substr(3,2)) >
(dl_endt.substr(3,2))))) {
alert("first date is greater");
return false;
}
alert("second date is digher");
return true;
}
/ * для проверки .... создайте форму и дайте идентификаторы двум входам даты. Формат даты должен быть мм / дд / гггг или мм-дд-гггг или мм: дд: гггг или мм.дд.гггг, как это . * /
Очень хорошая функция, за исключением одной мелочи. Предполагается, что пользовательский ввод всегда будет следовать заданному шаблону даты (использование подстрок). Думаю, я мог бы использовать это, хотя и с некоторой проверкой ввода, спасибо.
Это делает некоторые большие предположения о формате даты и не использует международные стандарты даты.
function fn_DateCompare(DateA, DateB) { // this function is good for dates > 01/01/1970
var a = new Date(DateA);
var b = new Date(DateB);
var msDateA = Date.UTC(a.getFullYear(), a.getMonth()+1, a.getDate());
var msDateB = Date.UTC(b.getFullYear(), b.getMonth()+1, b.getDate());
if (parseFloat(msDateA) < parseFloat(msDateB))
return -1; // lt
else if (parseFloat(msDateA) == parseFloat(msDateB))
return 0; // eq
else if (parseFloat(msDateA) > parseFloat(msDateB))
return 1; // gt
else
return null; // error
}
Добавление единицы к a/b.getMonth() приводит к тому, что январь, который является 0, становится 1, что переводится как февраль в метод Date.UTC. См. Статью mdn: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. Раздел о допустимых значениях параметра month. Попробуйте сравнить, например, даты «01.02.2017» и «31.01.2017» с помощью вашей функции.
function validateform()
{
if (trimAll(document.getElementById("<%=txtFromDate.ClientID %>").value) != "") {
if (!isDate(trimAll(document.getElementById("<%=txtFromDate.ClientID %>").value)))
msg = msg + "<li>Please enter valid From Date in mm/dd/yyyy format\n";
else {
var toDate = new Date();
var txtdate = document.getElementById("<%=txtFromDate.ClientID %>").value;
var d1 = new Date(txtdate)
if (Date.parse(txtdate) > Date.parse(toDate)) {
msg = msg + "<li>From date must be less than or equal to today's date\n";
}
}
}
if (trimAll(document.getElementById("<%=txtToDate.ClientID %>").value) != "") {
if (!isDate(trimAll(document.getElementById("<%=txtToDate.ClientID %>").value)))
msg = msg + "<li>Please enter valid To Date in mm/dd/yyyy format\n";
else {
var toDate = new Date();
var txtdate = document.getElementById("<%=txtToDate.ClientID %>").value;
var d1 = new Date(txtdate)
if (Date.parse(txtdate) > Date.parse(toDate)) {
msg = msg + "<li>To date must be less than or equal to today's date\n";
}
}
}
У меня было такое предложение, но функция getTime возвращает неопределенное значение. Не думаю, что я полностью понимаю getTime (). Это должна быть предопределенная функция?