【发布时间】:2020-08-22 11:58:33
【问题描述】:
我在 Asp.net Web Api Core 3.1 项目中使用Microsoft.AspNetCore.Odata 7.3。
事实证明,该库将服务器的 TimeZone 从 Ef 输出添加到 DateTimes。
Ef 本身返回带有DateTimeKind.Unspecified 的数据。
所以我希望 odata 库只是省略 TimeZone 转换,因为 webApi 服务的行为方式是这样的。
问题是如何使odata不添加服务器的TimeZone或以utc(Z格式)返回所有内容。
尝试通过 NewtonSoft serializerSettings 设置它,但它不适用于 OData 端点
services.AddOData();
services.AddMvc(options => {options.EnableEndpointRouting = false;});
services
.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
});
感谢您的帮助!
更新: 在 Ef 级别(通过 ValueConverters)将 DateTimeKind 设置为 Utc 允许服务器将日期时间正确转换为本地时间。
但仍然返回的日期时间不是 Z 格式,而是服务器的本地时区。
【问题讨论】:
-
遇到了这个问题。我认为采用指定为 UTC 的 DateTime 并将其输出为服务器时区中的 DateTimeOffset 是愚蠢的!谁给出了#(^& 服务器所在的时区。我采用的解决方案是切换到在任何地方使用 DateTimeOffset 并添加 ValueConverters 以确保我总是从 EntityFramework 获取 UTC DateTimeOffsets。如果这听起来对你有用,我可以把它写成答案,但我没有使用 DateTimes 和 OData 的解决方案。
-
Dan,请尝试 bort 的建议
endpoints.SetTimeZoneInfo(TimeZoneInfo.Utc);。它对我有用。
标签: c# odata asp.net-core-webapi