Сравните две даты с JavaScript


1953

Может кто-нибудь предложить способ сравнения значений двух дат больше, меньше, а не в прошлом с использованием JavaScript? Значения будут поступать из текстовых полей.


17
Когда дело доходит до DateTime и манипуляций в JS, я смотрю не дальше, чем на моменты :)
Halceyon

47
нет необходимости использовать моменты, чтобы сравнить 2 даты. Просто используйте чистый объект Date в JavaScript. Проверьте основной ответ для более подробной информации.
Лукас Лиезис

Вы можете сослаться на следующий ответ: stackoverflow.com/questions/4812152/… Проверьте getDateDifference и getDifferenceInDays, если это может помочь.
Викаш Раджпурохит

Я дам вам причину, чтобы посмотреть дальше, чем Moment.js ( который я люблю, НО ... ): не используйте для зацикливания нагрузок
Geek Stocks

Для полезной функции , чтобы получить временную разницу разделяется на единицы (секунды, минуты, часы и т.д.), смотрите ответ на stackoverflow.com/questions/1968167/... . Этот ответ теперь также доступен по адресу stackoverflow.com/a/46529159/3787376 .
Эдвард

Ответы:


2286

Объект Дата будет делать то , что вы хотите - конструкт один на каждую дату, а затем сравнить их с помощью >, <, <=или >=.

==, !=, ===, И !==операторы требуют использовать 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)

Тем не менее, я предлагаю вам использовать выпадающие списки или какую-то похожую ограниченную форму ввода даты, а не текстовые поля, чтобы не оказаться в аду проверки ввода.


64
Даже метод Эйса не безотказен. Сначала вам нужно сбросить миллисекунды, и вы можете даже сбросить все время. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Это в сочетании с использованием .getTime () даст вам точный результат сравнения
Патрик

102
@patrick, предложи позвонить setHours(0,0,0,0)так. Устраняет необходимость вызова setMinutes()и т. Д. Кроме того, выполняется быстрее.
Карл

26
избегая == или === для получения желаемого результата: jsfiddle.net/P4y5J сейчас> = anotherNow && сейчас <= anotherNow IS true FYI
Джейсон Себринг

5
Почему бы просто не использовать toString()метод в обе даты, а затем сравнить с ==оператором? Кажется, намного проще, чем сбрасывать время и сравнивать потом, есть ли недостатки для этого?
user2019515

13
Вы также можете сравнить числовые значения ваших дат, чтобы избежать сравнения самих объектов: date1.valueOf () == date2.valueOf ()
madprog

421

Самый простой способ сравнить даты в javascript - сначала преобразовать его в объект Date, а затем сравнить эти объекты date.

Ниже вы найдете объект с тремя функциями:

  • dates.compare (а, б)

    Возвращает число:

    • -1 если a <b
    • 0 если a = b
    • 1, если a> b
    • NaN, если a или b является недопустимой датой
  • date.inRange (d, начало, конец)

    Возвращает логическое значение или NaN:

    • истина, если d находится между началом и концом (включительно)
    • false, если d перед началом или после окончания .
    • NaN, если одна или несколько дат недопустимы.
  • dates.convert

    Используется другими функциями для преобразования их ввода в объект даты. Ввод может быть

    • Дата -объект: Входной возвращается как есть.
    • массив : Интерпретируется как [год, месяц, день]. ПРИМЕЧАНИЕ месяц 0-11.
    • номер : Интерпретированный как количество миллисекунд , прошедших с 1 января 1970 года (отметка о времени)
    • строка : Несколько различных форматов поддерживается, как "YYYY / MM / DD", "MM / DD / YYYY", "31 января 2009 года" и т.д.
    • объект : интерпретировано как объект с год, месяц и дата атрибутов. ПРИМЕЧАНИЕ месяц 0-11.

,

// 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
        );
    }
}

11
(a > b) - (a < b)полезно для сортировки массива дат
nktssh

@nikita Да, это так, и функцию, которая возвращает этот результат, можно использовать при 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; }
около

4
@ nktssh - может быть, но return a - bпроще и заменяет весь оператор return.
RobG

284

Сравните <и >как обычно, но все, что связано, =должно использовать +префикс. Вот так:

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

Надеюсь это поможет!


81
ужасно медленный :) Я предпочитаю x.getTime() === y.getTime()метод, как читабельный, так и очень быстрый, см. jsperf
huysentruitw

24
+Оператор пытается преобразовать выражение в номер. Date.valueOf()используется для преобразования (которое возвращает то же самое, что и Date.getTime().
Salman A

13
@WouterHuysentruit Оба очень быстрые (> 3 миллиона OPS в самом медленном браузере). Используйте метод, который вы считаете более читабельным
Eloims

13
Обратите внимание, что все , что связано с «=», должно использовать префикс «+» в вашем ответе неверно. <, <=, >И >=использовать тот же алгоритм ( абстрактный алгоритм относительного сравнения ) за кулисами.
Салман А

2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Благодаря вашему ответу, сервис, который я разрабатываю на работе, содержит ужасную ошибку, которую трудно отследить.
Gyuhyeon Ли

157

Реляционные операторы < <= > >=могут использоваться для сравнения дат 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()методы за сценой.


Безопасно ли конвертировать объект String в Date? Может ли это не бросить исключение или дать ненадежные результаты? Что может быть самым надежным способом составления дат в JS? Когда вы говорите о ненадежных результатах, может ли этот метод давать разные / неправильные значения, даже если мы уверены, что формат даты не изменится -> Это будет «Четверг, 10 августа 2017 года». Ваша помощь здесь очень ценится.
user2696258

Может ли это дать ненадежные результаты для одного и того же значения даты на разных ОС / браузерах / устройствах?
user2696258

1
@ user2696258 это самый надежный способ сравнения двух объектов Date . Преобразование строки в дату - это другая проблема ... используйте библиотеку разбора даты или накатывайте собственное решение. Thursday, 10 Aug 2017это нестандартный формат, и разные браузеры могут анализировать его по-разному или не анализировать вообще. Смотрите заметки на Date.parse.
Салман,

88

Безусловно, самый простой способ - вычесть одну дату из другой и сравнить результат.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);


68

Сравнение дат в 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

сравнить даты в JavaScript


Я обнаружил, что большинство решений для сравнения дат работают в любом браузере. Я столкнулся с проблемой IE. Это решение работало по всем направлениям. Спасибо Алиреза!
Джошуа Оглсби

2
Не работает И это не должно работать. Вы сравниваете объект даты.
Maxisam

3
@maxisam Нет, это делает работу из операторов сравнения ( <, >, <=, >=) используется, дата объекты преобразуются первым в UNIX эпохи ( в секундах), и он работает отлично. Однако это может привести к распространенной ошибке, date1 == date2когда действительно вводится ошибка, поскольку проверяется не равенство, а значение. Чтобы предотвратить это и проверить равенство значения даты, это сработало бы: date1.valueOf() == date2.valueOf()или корочеdate1+0 == date2+0
humanityANDpeace

Записка от MDN 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.
AaA

35

Сравнить только день (без учета компонента времени):

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
}

это хорошо. но что, если я сравниваю следующий день или предыдущий день. я попробовал это Date.prototype.nextDay = function (d) {вернуть this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {вернуть this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } но это будет работать только в этом месяце. Как я могу сравнить по месяцам или по годам
Paresh3489227

32

какой формат?

Если вы создаете объект 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

1
Вычитание является хорошей идеей, поскольку позволяет избежать ==проблемы сравнения, упомянутой выше.
devios1

Какой JavaScript REPL вы используете?
Hyde

JSDB - см. Jsdb.org - я использую его реже в наши дни, когда Python - мой любимый язык, но все же это отличная утилита.
Джейсон С

1
@ StuartP.Bentley Я не знаю, потому что я не использую ни одного из них. Я использую JSDB.
Джейсон С

при просмотре большого количества дат это кажется наиболее эффективным, потому что нет необходимости конвертировать с помощью getTime ().
pcarvalho

16

Вы используете этот код,

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


3
Причина, по которой не следует обращаться к W3Schools: w3fools.com - хорошее решение - соответствует ли оно стандартам и работает ли оно во всех браузерах?
Матиас Ликкегор Лоренцен

1
Лучше обратиться к Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Даниэль Лидстрем

16

КОРОТКИЙ ОТВЕТ

Вот функция, которая возвращает {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

объяснение

jsFiddle

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

DEMO

все, что вам нужно сделать, это передать любой из этих форматов в jsфайл библиотеки


новая дата (dtmfrom)> = новая дата (dtmto) намного медленнее новой даты (dtmfrom) .getTime ()> = новая дата (dtmto) .getTime ()
Мина Габриэль,

Возможно, но разница составляет от 30 до 120 наносекунд (скажем, 0,000000075 секунд) за операцию, в зависимости от браузера, поэтому не очень значительная.
RobG


14

Примечание - Сравнить только часть даты:

Когда мы сравниваем две даты в 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()будет работать как шарм.


13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

1
Какого они типа а или б? Сроки? Какой формат? Это не похоже на работу со мной.
Люси

5
предполагая aи bбудучи Dateобъектами, вы также можете использоватьreturn a*1 == b*1;
Udo G

4
@UdoG: короче:+a == +b
mpen

13
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

11

Просто чтобы добавить еще одну возможность ко многим существующим опциям, вы можете попробовать:

if (date1.valueOf()==date2.valueOf()) .....

... что, кажется, работает для меня. Конечно, вы должны убедиться, что обе даты не определены ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

Таким образом, мы можем обеспечить положительное сравнение, если оба они тоже не определены, или ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... если вы предпочитаете, чтобы они не были равны.


11

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


3
Нет необходимости использовать внешнюю библиотеку, такую ​​как Moment, для сравнения дат по Dateобъектам.
AMB

Момент был абсолютно необходим для моего случая использования. Спасибо, Разан!
razorsyntax

2
почему вы даже используете операторы <или, >если момент уже наступает с удобными методами сравнения, такими как .isBeforeи .isAfter, это все в документах
svarog

10

ОСТЕРЕГАЙТЕСЬ ВРЕМЕНИ

Дата в 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()

8

Допустим, вы получили объекты даты A и B, получите их значение времени EPOC, затем вычтите, чтобы получить разницу в миллисекундах.

var diff = +A - +B;

Это все.


8

Для сравнения двух дат мы можем использовать библиотеку JavaScript date.js, которую можно найти по адресу: https://code.google.com/archive/p/datejs/downloads

и использовать Date.compare( Date date1, Date date2 )метод, и он возвращает число, которое означает следующий результат:

-1 = дата1 меньше даты2.

0 = значения равны.

1 = дата1 больше даты2.


8

Вычтите две даты получите разницу в миллисекундах, если вы получите 0ту же дату

function areSameDate(d1, d2){
    return d1 - d2 === 0
}

7

Для того, чтобы создавать даты из свободного текста в Javascript, вам нужно разобрать его в объект Date ().

Вы можете использовать Date.parse (), который использует свободный текст, пытается преобразовать его в новую дату, но если у вас есть контроль над страницей, я бы рекомендовал вместо этого использовать поля выбора HTML или средство выбора даты, такое как элемент управления календаря YUI или пользовательский интерфейс jQuery. DatePicker .

Как только у вас есть дата, как указали другие люди, вы можете использовать простую арифметику, чтобы вычесть даты и преобразовать их обратно в число дней, разделив число (в секундах) на количество секунд в дне (60 * 60 * 24 = 86400).


6
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;
}

5

Улучшенная версия кода, размещенная "некоторыми"

/* 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));

Предположительно, это экземпляр Date, в котором вызывается метод. В этом случае может быть неверная дата, но все еще может быть экземпляром дата?
RobG

5

Если следующий формат даты, вы можете использовать этот код:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Он проверит, 20121121больше 20121103или нет число.


4
Если он уже имеет формат ISO8601 (ГГГГ-ММ-ДД), вам не нужно удалять какие-либо символы или преобразовывать его в целое число. Просто сравните строки first == secondили first < secondили first > second. Это одна из многих красот с ISO8601 по сравнению с ММ / ДД / ГГ, ДД / ММ / ГГ, ГГ / ДД / ММ, ДД / ГГ / ММ или ММ / ГГ / ДД.
некоторые

5

Я обычно храню 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);

Это лучший ответ - и самый быстрый jsperf.com/comparing-date-objects
Скотт Стенсланд

3

Прежде чем сравнивать Datesобъект, попробуйте установить обе их миллисекунды равными нулю Date.setMilliseconds(0);.

В некоторых случаях, когда Dateобъект динамически создается в javascript, если вы продолжите печатать Date.getTime(), вы увидите изменение миллисекунд, что помешает равенству обеих дат.


3

Представление

Сегодня 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) (оба являются средне-быстрыми)
  • решения F, L, N самые медленные для всех браузеров

введите описание изображения здесь

подробности

Ниже представлены решения с фрагментами, используемые в тестах производительности. Вы можете выполнить тест на вашей машине ЗДЕСЬ

Результаты для хрома

введите описание изображения здесь


Но d1==d2или d1===d2бесполезен в контексте вопроса.
TheMaster

1
        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.

Спасибо Д.Джеева


Я думаю, что это хороший ответ, потому что у нас есть формат «дд / мм / гг», и мы должны сделать это, чтобы сравнить обе даты. Я не знаю, лучший ли это ответ, но этого достаточно. Спасибо, что поделились.
Данигонлинея

1
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;
}

1

Вот что я сделал в одном из моих проектов,

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;
     }
}

называя это на форме на представлении. надеюсь это поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.