Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare two dates with JavaScript

Can someone suggest a way to compare the values of two dates greater than, less than, and not in the past using JavaScript? The values will be coming from text boxes.

like image 628
Alex Avatar asked Jan 29 '09 19:01

Alex


People also ask

Can we compare two dates in JavaScript?

In JavaScript, we can compare two dates by converting them into numeric values to correspond to their time. First, we can convert the Date into a numeric value by using the getTime() function. By converting the given dates into numeric values we can directly compare them.

How can I compare two dates?

For comparing the two dates, we have used the compareTo() method. If both dates are equal it prints Both dates are equal. If date1 is greater than date2, it prints Date 1 comes after Date 2. If date1 is smaller than date2, it prints Date 1 comes after Date 2.


2 Answers

The Date object will do what you want - construct one for each date, then compare them using the >, <, <= or >=.

The ==, !=, ===, and !== operators require you to use date.getTime() as in

var d1 = new Date(); var d2 = new Date(d1); var same = d1.getTime() === d2.getTime(); var notSame = d1.getTime() !== d2.getTime(); 

to be clear just checking for equality directly with the date objects won't work

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) 

I suggest you use drop-downs or some similar constrained form of date entry rather than text boxes, though, lest you find yourself in input validation hell.


For the curious, date.getTime() documentation:

Returns the numeric value of the specified date as the number of milliseconds since January 1, 1970, 00:00:00 UTC. (Negative values are returned for prior times.)

like image 143
moonshadow Avatar answered Oct 04 '22 05:10

moonshadow


The easiest way to compare dates in javascript is to first convert it to a Date object and then compare these date-objects.

Below you find an object with three functions:

  • dates.compare(a,b)

    Returns a number:

    • -1 if a < b
    • 0 if a = b
    • 1 if a > b
    • NaN if a or b is an illegal date
  • dates.inRange (d,start,end)

    Returns a boolean or NaN:

    • true if d is between the start and end (inclusive)
    • false if d is before start or after end.
    • NaN if one or more of the dates are illegal.
  • dates.convert

    Used by the other functions to convert their input to a date object. The input can be

    • a date-object : The input is returned as is.
    • 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 : Several different formats is supported, 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.

.

// 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         );     } } 
like image 30
some Avatar answered Oct 04 '22 06:10

some