Converting SAS date to Javascript datetime (in Javascript)

Converting a SAS date or datetime to javascript isn’t hard, but still - it should be easy to google for!

  var dtSAS=20563;   var dtJS=new Date(+new Date(1960,0,1) + dtSAS * 86400000);   alert(dtJS.toUTCString());

Right, that should get rid of 95% of readers, for the rest of you, a quick explanation.

First, it’s important to note that SAS dates are stored as number of days since Jan 1st, 1960 - whereas Javascript “dates” are actually the number of milliseconds since Jan 1st 1970.  This explains the 86400000 value (24 days _ 60 minutes _ 60 seconds * 1000 milliseconds), and why the embedded Date() object is set to 1960.

Next, there’s the ”+” sign before that nested Date object.  That tells Javascript to return a numeric value (-315619200000) instead of a formatted value (Fri Jan 01 1960 00:00:00 GMT+0000 (GMT Standard Time)).

Finally, the .toUTCString() method avoids contention with local time conventions (eg the extra 1 hour in BST).

To make this even easier to deal with, I’ve knocked together a simple Javascript function - see fiddle.

// valid in ECMASCRIPT 2016 function dtSAStoJS(dtSAS,dtType='DATE'){   // accepts SAS unformatted DATE or DATETIME   // dtType should be used to determine the above   // -315619200000 is equivalent to +new Date(1960,0,1)   // 86400000 is equivalent to 24h * 60m * 60s * 1000ms   if(dtType==='DATE'){     return new Date(-315619200000 + dtSAS * 86400000);   } else if (dtType==='DATETIME'){     return new Date(-315619200000 + dtSAS * 1000);   } else {     console.log('Unknown dtType value - ' + dtType);     return null;   } }; alert(dtSAStoJS(20578,'DATE').toUTCString()); alert(dtSAStoJS(1776743820,'DATETIME').toUTCString());

If this post was useful, then do also check out How To Build Web Apps With SAS.

And in case you were wondering - datetime 1776743820 (GMT) was when Dr Goodnight officially announced SAS Viya!