2009-08-03 28 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,'')));