- 
      
- 
        Save atk/1053863 to your computer and use it in GitHub Desktop. 
| // Polyfill for Date.parse | |
| Date.parse = Date.parse || function( | |
| a // ISO Date string | |
| ){ | |
| // turn into array, cutting the first character of the Month | |
| a = a.split(/\W\D?/); | |
| // create a new date object | |
| return new Date( | |
| // year | |
| a[3], | |
| // month (starting with zero) | |
| // we got only the second and third character, so we find it in a string | |
| // Jan => an => 0, Feb => eb => 1, ... | |
| "anebarprayunulugepctovec".search(a[1]) / 2, | |
| // day | |
| a[2], | |
| // hour | |
| a[4], | |
| // minute | |
| a[5], | |
| // second | |
| a[6] | |
| ) | |
| } | 
| Date.parse=Date.parse||function(a){a=a.split(/\W\D?/);return new Date(a[3],"anebarprayunulugepctovec".search(a[1])/2,a[2],a[4],a[5],a[6])} | 
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| Version 2, December 2004 | |
| Copyright (C) 2011 Alex Kloss <[email protected]> | |
| Everyone is permitted to copy and distribute verbatim or modified | |
| copies of this license document, and changing it is allowed as long | |
| as the name is changed. | |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 0. You just DO WHAT THE FUCK YOU WANT TO. | 
| { | |
| "name": "parsedate", | |
| "description": "Date.parse replacement", | |
| "keywords": [ | |
| "Date", | |
| "parse" | |
| ] | |
| } | 
| <!DOCTYPE html> | |
| <title>Foo</title> | |
| <div>Expected value: <b>Thu Mar 22 2007 12:56:06...</b></div> | |
| <div>Actual value: <b id="ret"></b></div> | |
| <script> | |
| var myFunction = Date.parse=Date.parse||function(a){a=a.split(/\W\D?/);return new Date(a[3],"anebarprayunulugepctovec".search(a[1])/2,a[2],a[4],a[5],a[6])} | |
| document.getElementById( "ret" ).innerHTML = myFunction(''+new Date(2007,2,22,12,56,6)); | |
| </script> | 
This should get you the polyfill in 139 bytes:
Date.parse=Date.parse||function(a){a=a.split(/[ :]\D?/);return Date(a[3],0|"anebarapayunulugepctovec".indexOf(a[1])/2,a[2],a[4],a[5],a[6])}
@eliperelman : Date without "new" returns the current date for me.
@jed : To extract the timezone, we could split ([+-]) too, but I don't see how to fit this in the rest of the bytes; we'd need to find out the difference to the current timezone, too and add/subtract it to/from the hours, too.
Hmm, interesting. Date() returns a string and new Date() returns an object. I'll look into it.
i don't think you need the 0| anymore.
You're right, @jed Updated accordingly
how about \W instead of [ :]?
Great idea - and since we haven't got special chars here, we can use search instead of indexOf, too.
would still love to nail the timezone issue, i think it's more important than the assignment.
Problems to solve for timezone:
- we lose the +/- of the timezone direction in the splitting atm
- we need to compare to the current timezone :-(
especially the latter will be too long for the last 25 bytes.
good points, @atk.
is there any potential in a function(a){return new Date(a.replace(...))} approach?
Alas, not. Either would it need a regexp to parse the whole string at once, which is 53 bytes long, and/or it would need a callback which resolves the month name, too, a part which currently takes amazing 41 bytes, add the 2 function statements and the new Date() and you're well over 140 bytes. It would look something like this:
function(a){return new Date(a.replace(/\w+ \w(\w+) (\d+) (\d+) (\d+):(\d+):(\d+) \w+(.\d+)/,function(a){a=arguments;[a[0],a[2]]=[a[2],a[0]];a[1]="anebarapayunulugepctovec".search(a[1])/2;return a.join(' ')}))}
Which does not yet take care of the timezone, btw.
i dunno, there's a bunch of stuff i thought was impossible before 140 bytes kicked off. what about something structured like this to reuse functions?
function a(b,c,d,e,f,g){return c?XXXXX:b.replace(/YYYYYY/,a)}nice idea - I will look into it later.
Shouldn't April be "pr"?
Yes, you are right. Changed.
@jed: I just found out that new Date([string]) internally calls Date.parse - so if it was not available anyway, we could only use eval for call will not work on new Date, thus enlargening the function quite a bit. Anyway, I will try to get Timezone handling inside this later.
Maybe this will help somehow for timezones:
var timezone = -7;
var d = new Date();
d.setUTCFullYear(2011, 6, 1) /* 1 Jul 2011 */
d.setUTCHours(1 + timezone, 0, 0) /* 01:00:00 UTC -7 hours  */
console.log(d.toUTCString());
// Thu, 30 Jun 2011 18:00:00 GMT
Works well in IE6+, Fx, Op, node.js
currently, I can cope for the given Date's timezone:
function(a){a=a.split(/[^\w-]\D?/);return new Date(a[3],"anebarprayunulugepctovec".search(a[1])/2,a[2],a[4]+(0|a[7].slice(2,5)),a[5],a[6])}
This doesn't take care of the local timezone, though - and I already got 139 bytes without the polyfill prefix.
Date.parse has been around since ES1 making a fallback seems a bit out of place. Also the workings of ES5/5.1 Date.parse are a bit too complex to fit in 140bytes.
nice work! i wonder if the 140bytes wizards can golf enough room in for
Date.parse=Date.parse||...or timezones.