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

- 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 Answers
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

- 807,428
- 183
- 922
- 838
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

- 5,774
- 28
- 22
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)) ...

- 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
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)
Hence
function compareDates(str1,str2) {
var d1 = Date.parse(str1.replace("/-/g," ")),
d2 = Date.parse(str2.replace("/-/g," "));
return d1<d2;
}

- 169,008
- 28
- 173
- 236