2012-08-03 42 views
9

Tôi không chắc chắn nếu đó là tôi thiếu một cái gì đó - hoặc IE hoặc Json.Net.Internet Explorer, Json.Net JavaScript ngày và mili giây vấn đề

Nhưng về cơ bản công trình này:

new Date("2012-08-03T12:36:54.743Z")

này không thành công với 'Ngày không hợp lệ' lỗi:

new Date("2012-08-03T12:36:54.74Z")

Ngày thứ hai được lưu trữ trong SQL Server như:

2012-08-03 12:36:54.740

Nó sau đó được đăng như JSON sử dụng Json.Net - Json.Net đã đăng ngày như 2012-08-03T12:36:54.74Z, hiệu quả cắt ra khỏi cuối cùng 0.

Câu hỏi của tôi (s):

  • Đây có phải là một dự định hành vi trong IE - rằng nó cần phải có tất cả 3 chữ số trong mili giây bit để làm việc?
  • Đây có phải là hành vi dự định trong Json.Net - nó sẽ luôn luôn cắt bỏ 0 cuối cùng trong một ngày?

Trả lời

11

Tôi không thể cho bạn biết nó có dự định hay không, nhưng tôi đã thực hiện rất nhiều tìm kiếm và tôi chưa tìm thấy giải pháp thực sự cho vấn đề này. Dường như chúng ta phải chấp nhận thực tế là IE chỉ chấp nhận chính xác ba chữ số. Cách duy nhất (cho tôi) để có được xung quanh vấn đề này là sử dụng một bộ chuyển đổi tùy chỉnh cho Json.NET khi tuần tự:

string json = JsonConvert.SerializeObject(
    whatEver, 
    new IsoDateTimeConverter 
     { 
      DateTimeFormat = "yyyy-MM-dd\\THH:mm:ss.fffK" 
     } 
    ); 

(chỉ thử nghiệm với Json.NET 4.0.8 và 4.5.8)

Lực lượng này Json.NET sử dụng chính xác 3 vị trí thập phân.

Theo như tôi có thể biết, Json.NET tuần tự hóa các giá trị DateTime ở định dạng ISO với độ chính xác tối đa cần thiết bỏ qua số 0 ở các vị trí thập phân của giá trị "thứ hai".

này phù hợp với sản lượng

someDateTimeValue.ToString("yyyy-MM-dd\\THH:mm:ss.FFFFFFFK") 
  • Một bình thường DateTime như DateTime.UtcNow sẽ được tuần tự lên đến 7 chữ số, bởi vì đó là độ chính xác của một DateTime (đo bằng Bọ ve).
  • Nếu phần "thứ hai" của DateTime có ít chữ số thập phân hơn, Json.NET bỏ qua các số không theo sau đó.
  • Giá trị ngày như DateTime.Today do đó sẽ chứa không chữ số phía sau giá trị "thứ hai" vì nó chính xác là 0.

See also this description of custom date and time format strings.

+0

Tôi có cùng một vấn đề bằng cách sử dụng API ASP.NET Web mới. Bạn có biết một cách để cấu hình JSON.Net một lần để điều này được thực hiện trong suốt ứng dụng? – Julius

+8

Bạn có thể chỉ định 'IsoDateTimeConverter' làm mặc định trong' GlobalConfiguration'. Mở 'Global.asax.cs' của bạn, và thêm một cái gì đó như thế này:' GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add (new IsoDateTimeConverter {DateTimeFormat = "yyyy-MM-dd \\ THH: mm: ss. fffK "});' – fero

+0

Tuyệt vời, chỉ là những gì tôi đang tìm kiếm :) – Julius

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