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

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

30 ответов


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

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

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


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

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

  • даты.сравните (a, b)

    возвращает номер:

    • -1 Если a
    • 0, если a = b
    • 1 Если a > b
    • NaN, если a или b является незаконным дата
  • даты.эти (d,начало,конец)

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

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

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

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

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

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:

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. Оба!--12-- функция> и унарные + оператор вызова 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

compare dates in 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 дата объект, вы можете просто вычесть их, чтобы получить разницу в миллисекундах (edit: или просто сравнить их):

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

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

вот функция, которая возвращает {boolean}, если from dateTime > to dateTime демонстрация в действии

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 в типе номера вы можете сравнить их с любыми операциями сравнения

( >, = И

затем

если вы знакомы с 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

демо

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


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

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

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


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

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


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

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


Via момент.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.библиотека JS JavaScript, которую можно найти по адресу:https://code.google.com/archive/p/datejs/downloads

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

-1 = date1-это lessthan date2.

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

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


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

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

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


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

var diff = +A - +B;

вот и все.


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

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

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

улучшенная версия кода, опубликованная "some"

/* 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 или нет.


Я обычно в магазине Dates as timestamps(Number) в базах данных.

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

преобразовать его в объект 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);

ОСТЕРЕГАЙТЕСЬ ЧАСОВОГО ПОЯСА

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

большую часть времени вы хотите, чтобы ваша дата отражала часовой пояс пользователя. нажать если сегодня ваш день рождения. Пользователи в NZ и US нажмите в то же время и получите разные даты. В таком случае сделайте вот что...

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

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

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

  • 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()

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

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


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

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


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

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


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

var myPickupDate = <pick up date> ;
var isPastPickupDateSelected = false;
var currentDate = new Date();

if(currentDate.getFullYear() <= myPickupDate.getFullYear()){
    if(currentDate.getMonth()+1 <= myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){
                        if(currentDate.getDate() <= myPickupDate.getDate() || currentDate.getMonth()+1 < myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){
                                            isPastPickupDateSelected = false;
                                            return;
                                        }
                    }
}
console.log("cannot select past pickup date");
isPastPickupDateSelected = true;