ibe*_*dev 3 c# datetime utc iso8601 asp.net-core-mvc
我遇到了一个我无法弄清楚的问题。
我尝试在服务器端始终处理 UTC DateTime。
我有一个 AspNetCore Mvc 应用程序,其端点接受可能包括 DateTimes 的查询。我希望 Mvc 了解这些日期已经在 UTC 中,而不是“再次”转换它们。
我的系统在西班牙,(UTC +2)
如果我像这样向我的本地主机服务器发送一个 http 请求:
http://localhost:50004/api/Resources?appliesOn=2018-06-30T18:00:00.000Z
Run Code Online (Sandbox Code Playgroud)
我想让反序列化的日期时间作为 UTC 表示与以下相同的日期:
DateTime.SpecifyKind(new DateTime(2018, 6, 30, 18, 0, 0), DateTimeKind.Utc)
Run Code Online (Sandbox Code Playgroud)
但是我可以看到 Mvc 总是将日期 2018-06-30T18:00:00.000Z 转换为两个小时后: 2018-06-30 20:00:00
我试图告诉 Mvc 使用 UTC json 序列化器/反序列化器,但没有任何变化:
services
.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
});
Run Code Online (Sandbox Code Playgroud)
有没有办法在 http GET 请求中发送查询参数已经作为 UTC 日期时间的表示?我理解 ISO 8601 中的日期,如果它有后缀 Z 表示“零偏移”,应该已经解释为 UTC 日期时间。为什么 Mvc 会对此进行转换并添加 2 小时的偏移量?
任何澄清将不胜感激!
PS:这是我的端点,你可以看到没有什么特别的:
[HttpGet("")]
public IActionResult GetResources()
{
var displayUri = Request.GetDisplayUrl();
var requestUri = new Uri(displayUri);
var filter = _filteredRequestFactory.Create(requestUri);
var resources = _myProjection.GetResourcers(filter);
return Ok(resources);
}
Run Code Online (Sandbox Code Playgroud)
在查询中使用 UTC 日期时间时,即使使用 ASP.NET-Core 3.1,此问题仍然存在。例如与[FromQuery].
在这个github-issue中也提供了一个非常有效的模型绑定器。
基本上你可以复制并粘贴它并注册它
仅适用于 Web-API 控制器:
services.AddController(options => options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
Run Code Online (Sandbox Code Playgroud)
对于成熟的 MVC 管道
services.AddMvc(options => options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5089 次 |
| 最近记录: |