Javascript serialization of DateTime in asp.net is not giving a javascript date object?
When I parse a DateTime to json in .Net it returns a string (i.e. "\/Date(1249335194272)\/"
). How do I make it return a js Date object constructor not wrap in a string?
// js server code
var dteNow = <%= jsonDateNow %>;
// js rendered code
var dteNow = "\/Date(1249335477787)\/";
// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.UI.WebControls;
namespace testing{
public partial class iTaxPrep : System.Web.UI.Page
{
protected string jsonDateNow;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
jsonDateNow = new JavaScriptSerializer().Serialize(DateTime.Now);
}
}
}
}
Solution 1:
This is a known limitation with JSON. This answer might help you, specifically:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
Solution 2:
This seems to work (Thanks Chris S for the idea). In the C# do a replace to remove the string wrapper from around the date object;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI.WebControls;
namespace test
{
[ScriptService]
public partial class testing: System.Web.UI.Page
{
protected string strCaseID;
protected string jsonCase;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
strCaseID =Tools.GetQueryObject("id");
// get a complex object with dates, string, arrays etc.
jsonESHACase = new JavaScriptSerializer().Serialize(objCase.Get(strCaseID ))
.Replace("\"\\/Date(", "new Date(").Replace(")\\/\"", ")");
}
}
}
}
..and after removing the quotes and adding the new prefix to Date this js now works. Hooray!
testCase= <%= jsonESHACase %>;
if (testCase) {
document.write(testCase["ClosingDate"].format("MM dd yyyy"));
}
Solution 3:
Simple javascript manipulation like this:
function(param){
var date = new Date(parseInt(param.substr(6)));
return date;
}
Pass in JSON date as param to the function and it will return a javascript date.
Solution 4:
With a little string manipulation and an eval you can create a Date object
var dteNow = "\/Date(1249335477787)\/";
var dteObj = eval("new " + dteNow.replace(/\//g,""));
Solution 5:
You can try this:
"MyField: " + string.Format("(function(y,m,d,h,mm,s){{var d=new Date(Date.UTC(y,m-1,d,h,mm,s));return d;}})({0},{1},{2},{3},{4},{5})", d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
This seems to work in FF and IE.