如果指定了 Z 后缀,为什么 Odata 会根据我的机器本地时间更改过滤器中的日期时间值?

问题描述 投票:0回答:2

我在我的 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 的计算机上运行。

asp.net datetime asp.net-web-api odata
2个回答
3
投票

在定义 UseMvc 的 Api 上,添加 SetTimeZoneInfo(TimeZoneInfo.Utc)。


0
投票

我使用下面的代码以时区格式返回响应

        try{
            if (!string.IsNullOrEmpty(_authIdentity.TimeZoneStandardName))
                configuration.SetTimeZoneInfo(TimeZoneInfo.FindSystemTimeZoneById(_authIdentity.TimeZoneStandardName.ToString()));
            else
                configuration.SetTimeZoneInfo(TimeZoneInfo.Utc);
        }
        catch
        {
            configuration.SetTimeZoneInfo(TimeZoneInfo.Utc);
        }
© www.soinside.com 2019 - 2024. All rights reserved.