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

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

+1746
источник поделиться
36 ответов
  • 1
  • 2

Объект 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)

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

+1991
источник

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

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

  • dates.compare(а, б)

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

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

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

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

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

    • a date -объект: вход возвращается как есть.
    • массив . Интерпретируется как [год, месяц, день]. ПРИМЕЧАНИЕ месяц равен 0-11.
    • a число. Интерпретируется как количество миллисекунд с 1 января 1970 года (временная метка)
    • a строка: поддерживается несколько различных форматов, например "ГГГГ/ММ/ДД", "ММ/ДД/ГГГГ", "Янв 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
        );
    }
}
+405
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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

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

+256
источник

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

Однако операторы равенства == != === !== не могут использоваться для сравнения (значения) дат потому что:

  • Два разных объекта никогда не равны ни для строгих, ни для абстрактных сравнений.
  • Эксперимент, сравнивающий объекты, имеет значение true, только если операнды ссылаются на один и тот же объект.

Вы можете сравнить значение дат равенства с помощью любого из этих методов:

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() за кулисами.

+142
источник

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

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

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);
+75
источник

Сравнение дат в JavaScript довольно просто... JavaScript имеет встроенную систему сравнения для дат, которая позволяет легко сравнивать.

Просто выполните следующие шаги для сравнения двух значений даты, например, у вас есть 2 входа, каждый из которых имеет значение Date в 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

compare dates in javascript

+63
источник

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

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
}
+35
источник

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

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

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

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

+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# Custom Date и Time Format String, эта библиотека должна делать то же самое и помогать вам форматировать дату и время 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 библиотеки

+16
источник
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
+13
источник
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}
+13
источник

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

Когда мы сравниваем две даты в 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
источник

Чтобы добавить еще одну возможность для многих существующих опций, вы можете попробовать:

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

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

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

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

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

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

+11
источник

Через 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

+10
источник

ОСТОРОЖНО ВРЕМЕНИ

В дате javascript нет понятия часового пояса. Это момент времени (тики с эпохи) с удобными функциями для перевода в строки и из строк в "локальном" часовом поясе. Если вы хотите работать с датами с использованием объектов даты, как это делают все, , вы хотите, чтобы ваши даты представляли собой полутонов UTC в начале указанной даты. Это обычное и необходимое соглашение, которое позволяет вы работаете с датами независимо от сезона или часового пояса их создания. Поэтому вам нужно быть очень бдительными, чтобы управлять понятием часового пояса, особенно когда вы создаете свой полуночный объект UTC Date.

В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения. Пользователи в Новой Зеландии и США щелкают одновременно и получают разные даты. В этом случае сделайте это...

// create a date (utc midnight) reflecting the value of myDate and the environment 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()
+9
источник

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

function areSameDate(d1, d2){
    return d1 - d2 === 0
}
+8
источник

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

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

-1 = date1 is lessthan date2.

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

1 = дата1 больше, чем дата2.

+8
источник

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

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

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

+7
источник

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

var diff = +A - +B;

Что все.

+7
источник
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;
}
+6
источник

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

/* 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));
+5
источник

Я обычно храню Dates как timestamps(Number) в базах данных.

Когда мне нужно сравнивать, я просто сравниваю эти временные метки или

преобразуйте его в объект Date, а затем при необходимости сравните с > <.

Обратите внимание, что == или === не работает должным образом, если ваши переменные не являются ссылками того же объекта 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);
+5
источник

Простой способ,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}
+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
источник

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

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

+2
источник
        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.

Спасибо D.Jeeva

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

вызов этого на форме onsubmit. надеюсь, что это поможет.

+1
источник

Предположим, что вы имеете дело с этим форматом даты 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

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

+1
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос