Deserializing Client-Side AJAX JSON Dates

Given the following JSON Date representation:

"/Date(1221644506800-0700)/"

How do you deserialize this into it’s JavaScript Date-type form?

I’ve tried using MS AJAX JavaScrioptSerializer as shown below:

Sys.Serialization.JavaScriptSerializer.deserialize("/Date(1221644506800-0700)/")

However, all I get back is the literal string date.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Provided you know the string is definitely a date I prefer to do this :

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))

Method 2

Bertrand LeRoy, who worked on ASP.NET Atlas/AJAX, described the design of the JavaScriptSerializer DateTime output and revealed the origin of the mysterious leading and trailing forward slashes. He made this recommendation:

run a simple search for “/Date((d+))/” and replace with “new Date($1)” before the eval
(but after validation)

I implemented that as:

var serializedDateTime = "/Date(1271389496563)/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\((\d+)\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

This is very close to the many of the other answers:

  • Use an anchored RegEx as Sjoerd Visscher did — don’t forget the ^ and $.
  • Avoid string.replace, and the ‘g’ or ‘i’ options on your RegEx. “/Date(1271389496563)//Date(1271389496563)/” shouldn’t work at all.

Method 3

A JSON value is a string, number, object, array, true, false or null. So this is just a string. There is no official way to represent dates in JSON. This syntax is from the asp.net ajax implementation. Others use the ISO 8601 format.

You can parse it like this:

var s = "/Date(1221644506800-0700)/";
var m = s.match(/^/Date((d+)([-+]dd)(dd))/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);

Method 4

The regular expression used in the ASP.net AJAX deserialize method looks for a string that looks like “/Date(1234)/” (The string itself actually needs to contain the quotes and slashes). To get such a string, you will need to escape the quote and back slash characters, so the javascript code to create the string looks like “”/Date(1234)/””.

This will work.

Sys.Serialization.JavaScriptSerializer.deserialize(""\/Date(1221644506800)\/"")

It’s kind of weird, but I found I had to serialize a date, then serialize the string returned from that, then deserialize on the client side once.

Something like this.

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);

Method 5

For those who don’t want to use Microsoft Ajax, simply add a prototype function to the string class.

E.g.

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(//Date((d+))//gi, "new Date($1)"));
};

Don’t want to use eval? Try something simple like

var date = new Date(parseInt(jsonDate.substr(6)));

As a side note, I used to think Microsoft was misleading by using this format. However, the JSON specification is not very clear when it comes to defining a way to describe dates in JSON.

Method 6

Actually, momentjs supports this kind of format, you might do something like:

    var momentValue = moment(value);

    momentValue.toDate();

This returns the value in a javascript date format

Method 7

The big number is the standard JS time

new Date(1221644506800)

Wed Sep 17 2008 19:41:46 GMT+1000 (EST)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x