user3265705
user3265705

Reputation: 17

JavaScript Date / Time

I have the following input and i can change the source of this data

Input

var strDate = "/Date(1391402871117+0100)/";

I can convert it to a date using eval, but i really dont want to eval

var DateResult1 = eval ("new Date(1391402871117+0100)");
console.log(DateResult1); // Date {Mon Feb 03 2014 05:47:51 GMT+0100 (Romance Standard Time)}

I did try this, sadly do not work:

// Remove /Date( )/
strDate = strDate.replace(/[^\d+]/g,'');

var DateResult3 = new Date(strDate);
console.log(DateResult3); //Date {Invalid Date}

When i write result of strDate i manual with out " it work.

var DateResult2 = new Date(1391402871117+0100);
console.log(DateResult2); // Date {Mon Feb 03 2014 05:47:51 GMT+0100 (Romance Standard Time)}

How can convert the input data into a date with out using eval or any library?

Upvotes: 1

Views: 327

Answers (3)

Josh Harrison
Josh Harrison

Reputation: 5994

If you can change the data source, as you say, why not do this?

Have your data source generate something like this, to add the timezone offset to the timestamp:

// convert timezone offset hours into seconds and add them to the timestamp
return (unixTimestamp + (timezoneOffsetHours * 3600)); 

Then you can do something like this in your JS:

// Math.floor works faster than parseInt to convert a string to integer :)
var timestamp = Math.floor(result of above timestamp generation);
var DateResult = new Date(timestamp);

The reason:

new Date() can't handle timezones specified in this way (or at all as far as I can Google)

Upvotes: 1

lanzz
lanzz

Reputation: 43168

You are very likely not getting a correct result out of this code:

var DateResult2 = new Date(1391402871117+0100);

The problem is the addition: 1391402871117+0100. 0100 is an octal constant, equal to 64 in decimal, which would add 64 milliseconds to the 1391402871117 timestamp. It seems likely to be indended as a time zone instead, but the Date constructor does not support time zones — only UTC and the local time zone of the browser.

Since UNIX timestamps are actually absolute (they are always in UTC), using just the timestamp would result in a Date instance referencing the correct instant in time, but possibly at another time zone. You can disregard the +0100 part, by converting the "1391402871117+0100" into an integer using parseInt:

strDate = strDate.replace(/[^\d+]/g,'');
var DateResult2 = new Date(parseInt(strDate));

Upvotes: 2

Zaheer Ahmed
Zaheer Ahmed

Reputation: 28548

try by parsing string to int:

var strDate = "/Date(1391402871117+0100)/";
strDate = strDate.replace(/[^\d+]/g, '');
var DateResult3 = new Date(parseInt(strDate.split('+')[0]) + parseInt(strDate.split('+')[1]));
console.log(DateResult3); 

Here is Demo

Upvotes: 0

Related Questions