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

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

48 ответов

Решение

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

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

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

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

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

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

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

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

  • dates.compare (а, б)

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

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

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

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

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

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

,

// Source: http://stackru.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
        );
    }
}

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

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

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

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

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

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

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

Когда мы сравниваем две даты в 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 first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

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

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

объяснение

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 файл

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
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

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

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

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

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

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

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

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

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

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

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

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

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

Будет ли проверяться 20121121 число больше чем 20121103 или нет.

Производительность

Сегодня, 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 самые медленные для всех браузеров

Детали

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

function A(d1,d2) {
 return d1.getTime() == d2.getTime();
}

function B(d1,d2) {
 return d1.valueOf() == d2.valueOf();
}

function C(d1,d2) {
 return Number(d1)   == Number(d2);
}

function D(d1,d2) {
 return d1 == d2;
}

function E(d1,d2) {
 return d1 === d2;
}

function F(d1,d2) {
 return (!(d1>d2 || d2>d1));
}

function G(d1,d2) {
 return d1*1 == d2*1;
}

function H(d1,d2) {
 return +d1 == +d2;
}

function I(d1,d2) {
 return !(+d1 - +d2);
}

function J(d1,d2) {
 return !(d1 - d2);
}

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

function L(d1,d2) {
 return !((d1>d2)-(d1<d2));
}

function M(d1,d2) {
  return d1.getFullYear() === d2.getFullYear()
    && d1.getDate() === d2.getDate()
    && d1.getMonth() === d2.getMonth();
}

function N(d1,d2) {
 return (isFinite(d1.valueOf()) && isFinite(d2.valueOf()) ? !((d1>d2)-(d1<d2)) : false );
}


// TEST

let past= new Date('2002-12-24'); // past
let now= new Date('2020-02-26');  // now

console.log('Code  d1>d2  d1<d2  d1=d2')
var log = (l,f) => console.log(`${l}     ${f(now,past)}  ${f(past,now)}  ${f(now,now)}`);

log('A',A);
log('B',B);
log('C',C);
log('D',D);
log('E',E);
log('G',G);
log('H',H);
log('I',I);
log('J',J);
log('K',K);
log('L',L);
log('M',M);
log('N',N);
p {color: red}
<p>This snippet only presents tested solutions (it not perform tests itself)</p>

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

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

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

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

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

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

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

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

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

var diff = +A - +B;

Это все.

Для того, чтобы создавать даты из свободного текста в 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));

Я обычно храню 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()вы увидите изменение миллисекунд, что помешает равенству обеих дат.

Давайте предположим, что вы имеете дело с этим 2014[:-/.]06[:-/.]06 или это 06[:-/.]06[:-/.]2014 формат даты, тогда вы можете сравнить даты таким образом

var a = '2014.06/07', b = '2014-06.07', c = '07-06/2014', d = '07/06.2014';

parseInt(a.replace(/[:\s\/\.-]/g, '')) == parseInt(b.replace(/[:\s\/\.-]/g, '')); // true
parseInt(c.replace(/[:\s\/\.-]/g, '')) == parseInt(d.replace(/[:\s\/\.-]/g, '')); // true
parseInt(a.replace(/[:\s\/\.-]/g, '')) < parseInt(b.replace(/[:\s\/\.-]/g, '')); // false
parseInt(c.replace(/[:\s\/\.-]/g, '')) > parseInt(d.replace(/[:\s\/\.-]/g, '')); // false

Как видите, мы удаляем разделитель (и) и затем сравниваем целые числа.

Мой простой ответ на этот вопрос

      checkDisabled(date) {
    const today = new Date()
    const newDate = new Date(date._d)
    if (today.getTime() > newDate.getTime()) {
        return true
    }
    return false
}
       

Если обе ваши даты имеют формат «ГГГГ-ММ-ДД», вы можете пропустить объект Date и напрямую сравнивать строки.

Это работает из-за того, как строки сравниваются в JS.

      let date1 = '2022-12-13';
let date2 = '2022-02-13';

console.log(`${date1} > ${date2}`, date1 > date2);
console.log(`${date1} < ${date2}`, date1 < date2);
console.log(`${date1} == ${date2}`, date1 == date2);

Другие вопросы по тегам