Compare Dates in JavaScript

Mar 18, 2020

Suppose you have two JavaScript Date objects:

const d1 = new Date('2019-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

How do you compare if two dates are equal? Surprisingly, both triple equals and double equals don't work when comparing two dates.

const d1 = new Date('2019-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

d1 === d3; // false
d1 == d3; // false

To compare two dates, you can use either toString() or valueOf(). The toString() method converts the date into an ISO date string, and the valueOf() method converts the date into milliseconds since the epoch.

const d1 = new Date('2019-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

// 'Fri May 31 2019 20:00:00 GMT-0400 (Eastern Daylight Time)'
d1.toString();
d1.valueOf(); // 1559347200000

d1.toString() === d2.toString(); // false
d1.toString() === d3.toString(); // true

d1.valueOf() === d2.valueOf(); // false
d1.valueOf() === d3.valueOf(); // true

Before and After

Although neither == nor === can compare whether two dates are equal, surprisingly both < and > work fine for comparing dates:

d1 < d2; // false
d1 < d3; // false

d2 < d1; // true

So to check if date a is before date b, you can just check a < b.

Another neat trick: you can subtract dates in JavaScript. Subtracting a - b gives you the difference between two dates in milliseconds.

const d1 = new Date('2019-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

d1 - d3; // 0
d1 - d2; // 1 year in milliseconds, 1000 * 60 * 60 * 24 * 365

In other words, you can compare two dates a and b by using a - b. If b is after a, then a - b < 0.

Sorting

Sorting an array of dates in JavaScript doesn't work as you might expect. The below sort() call gives you the dates in reverse order.

const d1 = new Date('2017-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

[d2, d1, d3].sort(); // [d3, d2, d1]

Why is that? Because JavaScript's sort function implicitly converts all values in the array into strings before sorting. So the above sort() is actually sorting based on the below string values:

[ 'Fri May 31 2019 20:00:00 GMT-0400 (Eastern Daylight Time)',
  'Thu May 31 2018 20:00:00 GMT-0400 (Eastern Daylight Time)',
  'Wed May 31 2017 20:00:00 GMT-0400 (Eastern Daylight Time)' ]

In other words, JavaScript implicitly sorts arrays of dates based on the day of the week by default.

To sort dates based on which date happened first, you need to pass a compare() callback to the sort() function. The compare() function should return:

Since JavaScript lets you subtract dates, you can just use a - b as your comparison function:

const d1 = new Date('2017-06-01');
const d2 = new Date('2018-06-01');
const d3 = new Date('2019-06-01');

[d2, d1, d3].sort((a, b) => a - b); // [d1, d2, d3]

Did you find this tutorial useful? Say thanks by starring our repo on GitHub!

More Fundamentals Tutorials