javascript - 序列化 DateTime 属性以在 javascript 中工作

标签 javascript c# json datetime json.net

我有一个具有 DateTime 属性的 C# 对象列表,我使用 NewtonSoft 对其进行序列化

result = Newtonsoft.Json.JsonConvert.SerializeObject( PagedZoningCases );

这使得日期时间显示为:

CallDateTime: "2017-04-17T17:06:00"

但这在 javascript 中不好,所以我尝试了以下

result = Newtonsoft.Json.JsonConvert.SerializeObject( PagedZoningCases, new Newtonsoft.Json.Converters.JavaScriptDateTimeConverter);

这更好一点,它会产生以下结果:

CallDateTime: "new Date(1396496760000)"

当我将结果返回到页面并在 javascript 中执行 JSON.parse(result) 时,它会抛出错误

我执行了以下测试来查看 javascript 的期望:

    var date = new Date();
    console.log(date); //Thu Nov 21 2019 15:29:33 GMT+1300 (New Zealand Daylight Time)
    var json = JSON.stringify(date);
    console.log(json); //"2019-11-21T02:29:33.392Z"
    var date2 = new Date(dateStr);
    console.log(date2); //Thu Nov 21 2019 15:29:33 GMT+1300 (New Zealand Daylight Time)

所以 NewtonSoft 的转换器似乎没有将日期转换为在 Date() 函数内工作的正确值。它给出了纪元过去的毫秒数,但 javascript 并不期望这样。

如何从 C# 序列化 DateTime 并通过 JSON 将其解析为 JavaScript 日期对象?

最佳答案

你似乎在某个地方缺少了一步,因为从表面上看,你做的一切都是正确的。因此,让我在这里概述所需的步骤:

  1. 您有一个具有 DateTime 类型属性的类,例如PagedZoningCase:

    public class PagedZoningCase
    {
        public DateTime CallDateTime { get; set; }
    }
    
  2. 您有一个 PagedZoningCase 类型的对象,并使用以下代码序列化它:

    var records = new List<PagedZoningCase> { new PagedZoningCase { CallDateTime = DateTime.Now } };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(records);
    
  3. 你会得到一个如下所示的 json:

    "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]"
    
  4. 在客户端,您解析此 json,并使用 Date 构造函数,因为 JSON does not know anything about dates :

    var json = "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]";
    var records = JSON.parse(json);
    var recordsWithDates = records.map(function (r) { 
       r.CallDateTime = new Date(r.CallDateTime); 
       return r;
    });
    

就是这样。您可以验证您是否具有像这样的 Date 类型(顺便说一句,不要尝试在 StackOverflow 控制台中打印日期,因为它只打印字符串):

var json = "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]";
var records = JSON.parse(json);
var recordsWithDates = records.map(function (r) { 
   r.CallDateTime = new Date(r.CallDateTime); 
   return r;
});
// validate CallDateTime is of Date type
console.log(typeof recordsWithDates[0].CallDateTime.getMonth === 'function') 

关于javascript - 序列化 DateTime 属性以在 javascript 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966541/

相关文章:

java - 在 Json 数组中搜索值

java - WSO2 ESB 消息上下文无法通过自定义类中介器更改

ruby-on-rails - 为 ruby​​ 2.0 安装 json gem 时出错

javascript - 第一次单击按钮后图像 slider 卡住

javascript - for循环不返回结果

javascript - filepicker.io 在 Chrome 中阻止了 iframe

c# - Microsoft WinForms 图表控件 - 设置 Y 轴标签的位置

javascript - jquery.countdown.js 显示错误的日期

c# - 具有 IsBackground 的 Lambda 线程

c# - 如何从 LINQ DataContext.SubmitChanges() 获取 TSQL 查询