2009-08-03 89 views
44

当我在.Net中将DateTime解析为json时,它返回一个字符串(即"\/Date(1249335194272)\/")。如何让它返回一个js Date对象的构造函数而不是包装在一个字符串中?asp.net中的DateTime Javascript序列化没有给出一个JavaScript日期对象?

// 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); 

      } 
     } 
    } 
} 

回答

14

这似乎是工作(感谢克里斯S为理念)。在C#中做一个替换来从日期对象周围移除字符串包装器;

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(")\\/\"", ")"); 
        } 
       } 
      } 
     } 

..和删除引号并添加新的前缀为DATE这个js现在工作之后。万岁!

testCase= <%= jsonESHACase %>; 
    if (testCase) { 
     document.write(testCase["ClosingDate"].format("MM dd yyyy")); 
    } 
0
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay()); 
+0

实际的问题是我需要将对象序列化为包含日期的JSON并在客户端使用这些日期。 – 2009-08-03 22:05:15

-2

此示例适用

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    DateTime dt = DateTime.Now; 
    DateTime dt1 = dt; 

    string jsonDateNow = serializer.Serialize(dt1); 
+0

这甚至在做什么? `DateTime dt1 = dt`什么都不做。 – 2017-07-22 01:48:29

55

这是known limitation使用JSON。 This answer可以帮助你,具体如下:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10)); 
+0

绝对是正确的答案,不错的帖子。 – 2009-08-04 14:22:51

+0

这就是我最终做的事,但是当我解析一个包含多个日期和其他信息的大对象时,这会开始看起来很丑。 – 2009-08-04 15:25:19

+0

看起来很丑,但没有更好的办法.. – RredCat 2011-03-29 07:45:36

3

随着一点点的字符串操作和一个eval你可以创建一个Date对象

var dteNow = "\/Date(1249335477787)\/"; 
var dteObj = eval("new " + dteNow.replace(/\//g,"")); 
1

你可以试试这个:

"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); 

这似乎在FF和IE浏览器的工作。

7

简单的JavaScript操作是这样的:

function(param){ 
    var date = new Date(parseInt(param.substr(6))); 
    return date; 
} 

通在JSON日期作为参数去功能,它会返回一个JavaScript的日期。

0

下面是使用Date.parse和则DateTime.ToString一个选项:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToString("MMMM dd, yyyy")")); 

如果你需要时间,考虑下。我相信,这依赖于一个新的JavaScript规范:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToUniversalTime().ToString("s")")); 

下面是一个使用jQuery的一个选项:(我敢肯定有办法在这里加入的时间)

var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")"); 
0

稍微简单的字符串清理RegEx ...

var myDate =“\/Date(1508821200000)/”;
var jsDate = new Date(parseInt(myDate.replace(/ \ D/g,'')));