3

I have two dates 18-Aug-2010 and 19-Aug-2010 of this format. How to find whether which date is greater?

ACP
  • 34,682
  • 100
  • 231
  • 371
  • Your question is a possible duplicate of this question: http://stackoverflow.com/questions/492994/compare-2-dates-with-javascript The solution described there should help you. – Manoj Govindan Aug 18 '10 at 07:05
  • is the language for the text guaranteed to be english? – davidsleeps Aug 19 '10 at 04:41
  • @David can't get what you are trying to say? – ACP Aug 19 '10 at 04:44
  • 18-Aug is English specific...10-Oct is English, but in Indonesian (for example) it would be 10-Okt etc...the MMM desc is language dependent...unless you are guaranteeing a specific language – davidsleeps Aug 19 '10 at 05:12

5 Answers5

8

You will need to create a custom parsing function to handle the format you want, and get date objects to compare, for example:

function customParse(str) {
  var months = ['Jan','Feb','Mar','Apr','May','Jun',
                'Jul','Aug','Sep','Oct','Nov','Dec'],
      n = months.length, re = /(\d{2})-([a-z]{3})-(\d{4})/i, matches;

  while(n--) { months[months[n]]=n; } // map month names to their index :)

  matches = str.match(re); // extract date parts from string

  return new Date(matches[3], months[matches[2]], matches[1]);
}

customParse("18-Aug-2010");
// "Wed Aug 18 2010 00:00:00"

customParse("19-Aug-2010") > customParse("18-Aug-2010");
// true
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
3

You can do the parsing manually, for your given format, but I'd suggest you use the date.js library to parse the dates to Date objects and then compare. Check it out, its awesome!

And moreover, its a great addition to your js utility toolbox.

naikus
  • 24,302
  • 4
  • 42
  • 43
3

The native Date can parse "MMM+ dd yyyy", which gives:

function parseDMY(s){
  return new Date(s.replace(/^(\d+)\W+(\w+)\W+/, '$2 $1 '));
}
+parseDMY('19-August-2010') == +new Date(2010, 7, 19) // true
parseDMY('18-Aug-2010') < parseDMY('19-Aug-2010')     // true
matyr
  • 5,774
  • 28
  • 22
1

Firstly, the 'dd-MMM-yyyy' format isn't an accepted input format of the Date constructor (it returns an "invalid date" object) so we need to parse this ourselves. Let's write a function to return a Date object from a string in this format.

function parseMyDate(s) {
    var m = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];
    var match = s.match(/(\d+)-([^.]+)-(\d+)/);
    var date = match[1];
    var monthText = match[2];
    var year = match[3];
    var month = m.indexOf(monthText.toLowerCase());
    return new Date(year, month, date);
}

Date objects implicitly typecast to a number (milliseconds since 1970; epoch time) so you can compare using normal comparison operators:

if (parseMyDate(date1) > parseMyDate(date2)) ...
Delan Azabani
  • 79,602
  • 28
  • 170
  • 210
  • Instead of using hackish `* 1` hacks to cast the result to an integer, you should rather use `parseInt(s.match(/(\d+)/g)[1], 10)` to get the Integer object. – Denis 'Alpheus' Cahuk Aug 18 '10 at 07:25
  • With the OP's format `s.match(/(\d+)/g);` will return you a two element array, e.g. `"12-Aug-2010".match(/(\d+)/g); // ["12", "2010"]`, you are accessing the `1` and `2` indexes. Also you need some way to map the three letter month name with the month number... – Christian C. Salvadó Aug 18 '10 at 07:27
  • @Denis in this case we don't even need to convert the strings to numbers, the [`Date` constructor](http://bclary.com/2004/11/07/#a-15.9.3) will convert each argument internally `ToNumber` ;) – Christian C. Salvadó Aug 18 '10 at 07:28
  • @CMS, I've fixed both problems. Fixed the first one by removing 'global search' tag. Fixed the second one by using `indexOf` to search. – Delan Azabani Aug 18 '10 at 07:34
  • @Delan, nice, you just have to adjust your indexes again for the `date` and `year` matches (and you can remove those ugly `* 1` without problems) :) – Christian C. Salvadó Aug 18 '10 at 07:37
  • No, they are correct now when the `g` modifier is off because `0` is the entire matched string, while `1` and on are the captured matches. I'll remove the multiplication :D – Delan Azabani Aug 18 '10 at 07:40
  • @Delan, I see, but then, the two `match` method calls (for the `date` and `year` variables) will give you exactly the same result. You will be able to capture only the `date` part, not the year. – Christian C. Salvadó Aug 18 '10 at 07:46
  • Aaaah, I see. I've fixed it to run one match call that captures all three 'fields' of the date. Thanks ;) – Delan Azabani Aug 18 '10 at 07:54
0

Update: IE10, FX30 (and likely more) will understand "18 Aug 2010" without the dashes - Chrome handles either

so Date.parse("18-Aug-2010".replace("/-/g," ")) works in these browsers (and more)

Live Demo

Hence

function compareDates(str1,str2) {
  var d1 = Date.parse(str1.replace("/-/g," ")),
      d2 = Date.parse(str2.replace("/-/g," "));
  return d1<d2;
}
mplungjan
  • 169,008
  • 28
  • 173
  • 236