如果是“datetime”而不是“date”,则在末尾添加“z”(JsonSerializerSettings)

spo*_*rts 5 c# datetime json.net

事实:

  1. 在 SQL Server 中,有列类型datetimedate
  2. 使用 EF, 和 都datetime映射date到 C# 的DateTime
  3. 在我的datetime专栏中,我始终存储 UTC 日期。
  4. 在我当前的数据库中没有date列,但我需要在我将拥有的新表中使用它
  5. 我的典型数据流是:SQL Server --> C# (server side) --> JSON (client side)

我已将 JSON 序列化器设置为始终DateTime以 格式将变量返回给客户端yyyy-MM-ddThh:mm:ssZ,这对于 JavaScript 来说是一种很好的格式。末尾的 Z(“zulu”)声明它位于 UTC 时区,因此我的客户端应用程序知道它需要修复显示时区。到目前为止,所有内容都需要在显示时进行时区固定(因为所有内容都是 UTC)

因为我想开始使用 SQL Server 类型date,所以Z最终在这些date情况下会很麻烦(但在这些datetime情况下仍然需要)。由于我服务器端的所有内容都是DateTime,我不确定如何让 JSON 序列化器知道DateTime他正在查看哪种类型......

我的问题是...是否有可能知道JsonSerializerSettings他是否正在转换DateTime来自 adate或 a 的 a datetime?如果没有,解决这个问题的好方法是什么?

这是我的序列化器:

public class JsonNetResult : ActionResult
{
    public Encoding ContentEncoding { get; set; }
    public string ContentType { get; set; }
    public object Data { get; set; }

    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }

    public JsonNetResult()
    {
        var isoDateTimeConverter = new IsoDateTimeConverter();
        isoDateTimeConverter.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";

        SerializerSettings = new JsonSerializerSettings();
        SerializerSettings.Converters.Add(isoDateTimeConverter);
    }

    public override void ExecuteResult(ControllerContext context)
    {
          ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用它的方式:

return new JsonNetResult()
{
    Data = new
    {
        persons = dbContext.Persons.Select(e => new 
        {
             name = e.Name,
             someDate1 = e.SomeDate1, // datetime
             someDate2 = e.SomeDate2  // date
        })
    }
};
Run Code Online (Sandbox Code Playgroud)