2009-08-03 27 views
44

Khi tôi phân tích cú pháp DateTime thành json trong .Net, nó trả về một chuỗi (ví dụ: "\/Date(1249335194272)\/"). Làm thế nào để làm cho nó trở về một js Date object constructor không bọc trong một chuỗi?Tuần tự hóa Javascript của DateTime trong asp.net không đưa ra một đối tượng ngày 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); 

      } 
     } 
    } 
} 

Trả lời

14

Điều này có vẻ hiệu quả (Cảm ơn Chris S về ý tưởng). Trong C# làm một thay thế để loại bỏ các wrapper chuỗi từ xung quanh đối tượng ngày;

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

..và sau khi xóa dấu ngoặc kép và thêm tiền tố mới vào Ngày js này hiện hoạt động. Hoan hô!

testCase= <%= jsonESHACase %>; 
    if (testCase) { 
     document.write(testCase["ClosingDate"].format("MM dd yyyy")); 
    } 
+1

Tôi thích câu trả lời này cho các câu trả lời khác mà khắc phục vấn đề trong JS. Vấn đề nằm trong .Net, vì vậy cần được giải quyết trong .Net IMO. – Carl

0
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay()); 
+0

Vấn đề thực sự là tôi cần phải tuần tự hóa các đối tượng vào JSON chứa ngày tháng và sử dụng những ngày đó phía máy khách. –

-2

dụ này hoạt động

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

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

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

điều này thậm chí còn làm gì? 'DateTime dt1 = dt' không làm gì cả. –

55

Đây là một known limitation với JSON. This answer có thể giúp bạn, cụ thể:

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

Chắc chắn câu trả lời đúng, bài đăng hay. –

+0

Đó là khá nhiều những gì tôi đã kết thúc làm nhưng khi tôi phân tích một đối tượng lớn có chứa một số ngày và thông tin khác này sẽ bắt đầu tìm kiếm xấu xí. –

+0

Trông xấu xí nhưng không có cách nào tốt hơn .. – RredCat

3

Với một thao tác chuỗi chút và một eval bạn có thể tạo một đối tượng Date

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

[eval là tà ác] (http://24ways.org/2005/dont-be-eval/) v.v., nhưng nếu không được thực hiện tốt. – ruffin

0

tôi đã tìm thấy rằng đây là một kỹ thuật hữu ích để đối phó với vấn đề này:

http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html

Nó cho phép DateTimes được nối tiếp thành chuỗi ngày tháng ISO 8601 có thể được sử dụng với hàm tạo ngày JavaScript và có tiền thưởng là được đọc của con người có thể.

+0

Rất nhiều câu trả lời của bạn dường như chứa rất ít nội dung ngoài chỉ một liên kết đến bài đăng trên blog của bạn. Bất kỳ cơ hội nào bạn có thể mở rộng khi họ biến chúng thành câu trả lời thực sự? Phần còn lại trông tuyệt vời và tôi chắc rằng các bài đăng trên blog cũng sẽ tạo ra các câu trả lời tuyệt vời. – Flexo

1

Bạn có thể thử này:

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

Điều này dường như làm việc trong FF và IE.

7

đơn giản thao tác javascript như thế này:

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

đèo trong ngày JSON như param đến chức năng và nó sẽ trở lại một ngày javascript.

+0

Tại sao câu trả lời này tốt hơn câu trả lời được chấp nhận? –

+1

vì đây là câu trả lời rất đơn giản cũng đúng! ^ –

0

Dưới đây là một tùy chọn sử dụng Date.parse và DateTime.ToString:

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

Nếu bạn cần có thời gian, hãy xem xét những điều sau đây. Tôi tin rằng điều này phụ thuộc vào một spec mới hơn javascript:

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

Dưới đây là một tùy chọn sử dụng jQuery: (Tôi chắc rằng có một cách để thêm thời gian ở đây)

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

Chuỗi đơn giản hơn, sạch sẽ hơn với RegEx ...

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

Các vấn đề liên quan