【问题标题】:ASP.NET DateTime Serialization in QueryString vs BodyQueryString 与正文中的 ASP.NET 日期时间序列化
【发布时间】:2019-09-30 10:54:31
【问题描述】:

我注意到DateTime 对象对于 QueryString 和 Body 之间的相同值的序列化方式不同。基础值仍然是相同的正确值,但是序列化的 QueryString 的 DateTimeKindLocal,而 Body 是 Utc

端点

[HttpPost]
public ActionResult Post([FromQuery] DateTime queryDate, [FromBody] DateTime bodyDate)
{
  var result = new
  {
    queryDateKind = queryDate.Kind.ToString(),
    bodyDateKind = bodyDate.Kind.ToString()
  };

  return new ObjectResult(result);
}

请求

POST /api/values?queryDate=2019-05-12T00%3A00%3A00.000Z HTTP/1.1
Host: localhost:5000
Content-Type: application/json
cache-control: no-cache
"2019-05-12T00:00:00.000Z"

响应

{
    "queryDateKind": "Local",
    "bodyDateKind": "Utc"
}

知道这是为什么吗?是否有可能始终序列化为相同的DateTimeKind 的设置?

最好我不想到处使用ToUniversalTime()ToLocalTime(),也不想使用任何自定义IModelBinder

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    不幸的是它就是这样,看看这个答案 - Passing UTC DateTime to Web API HttpGet Method results in local time

    这与查询字符串参数和消息体的处理方式不同,模型绑定与参数绑定有关。

    您必须调用 .ToUniversalTime() 或实现您自己的模型绑定器来解决此问题。

    【讨论】:

    • 这并不完全正确。您可以简单地配置 JSON 格式化程序来实现所需的结果。比如:services.AddMvc().AddJsonOptions(x => x.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local);
    • @haim770 该设置只会影响消息正文中的模型绑定。它对参数绑定没有影响。但是,是的,如果他总是想要本地时间,那就可以了。
    【解决方案2】:

    在 API 模型中使用 DateTimeOffset 将避免不必要的时区转换。见answer to another question

    【讨论】:

    • 这仅在使用AutoMapper 时有效。请参阅链接答案。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多