我在我的 asp.net Web api 上使用 Odata V4。当我使用 odata 按日期时间过滤发出此请求时,它会从我在 url 中提供的日期中减去实体框架发送到我的日期的 8 小时(我的计算机本地时间设置为太平洋标准时间 UTC -8:00)数据库。
...Documents?$select=Id,ModifiedDate&$filter=ModifiedDate ge 2018-02-10T00:00:00Z&$orderby=ModifiedDate
这是实体框架提供的此请求的日志。
Opened connection at 2/9/2018 5:16:40 PM -08:00
SELECT TOP (101)
[Project1].[DocumentId] AS [DocumentId],
[Project1].[C2] AS [C1],
[Project1].[C3] AS [C2],
[Project1].[C4] AS [C3],
[Project1].[C5] AS [C4],
[Project1].[C1] AS [C5]
FROM ( SELECT
[Extent1].[DocumentId] AS [DocumentId],
[Extent1].[ModifiedDate] AS [ModifiedDate],
CAST( [Extent1].[DocumentId] AS bigint) AS [C1],
N'8da97389-55d6-4534-b683-2e767485606a' AS [C2],
N'ModifiedDate' AS [C3],
CAST( [Extent1].[ModifiedDate] AS datetime2) AS [C4],
N'Id' AS [C5]
FROM [dbo].[EstimateDocument] AS [Extent1]
WHERE [Extent1].[ModifiedDate] >= convert(datetime2, '2018-02-09 16:00:00.0000000', 121)
) AS [Project1]
ORDER BY [Project1].[ModifiedDate] ASC, [Project1].[C1] ASC
-- Executing at 2/9/2018 5:16:40 PM -08:00
-- Completed in 435 ms with result: SqlDataReader
odata 似乎从我说的过滤时间中减去了 8 个小时。我认为我在 url 中指定的日期末尾的 Z 代表 UTC 时间。为什么 Odata 在提出请求之前更改此日期?数据库中存储的日期也是 UTC 时间。为什么它认为需要进行任何转换?
我注意到,如果我将计算机本地时间更改为 UTC(我的服务在本地运行),那么它不会尝试进行任何转换。但我不能指望该服务能够在本地时间设置为 UTC 的计算机上运行。
在定义 UseMvc 的 Api 上,添加 SetTimeZoneInfo(TimeZoneInfo.Utc)。
我使用下面的代码以时区格式返回响应
try{
if (!string.IsNullOrEmpty(_authIdentity.TimeZoneStandardName))
configuration.SetTimeZoneInfo(TimeZoneInfo.FindSystemTimeZoneById(_authIdentity.TimeZoneStandardName.ToString()));
else
configuration.SetTimeZoneInfo(TimeZoneInfo.Utc);
}
catch
{
configuration.SetTimeZoneInfo(TimeZoneInfo.Utc);
}