使用 GenerateFilterConditionForDate 构建的查询将时间更改为 Azure Table 存储中的 UTC 时间

Query framed using GenerateFilterConditionForDate changes time to UTC time in Azure Table Storage

我的问题

使用 GenerateFilterConditionForDate 构造的查询将时间更改为 UTC 时间。

我做了什么

下面是使用的查询

var queryDtFrom = TableQuery.CombineFilters(filterJoin,
            TableOperators.And,
            TableQuery.GenerateFilterConditionForDate("TimeReceived", QueryComparisons.GreaterThanOrEqual, fromDateTimeOffset));

frmDateTimeOffset传递的值是{6/18/2018 5:00:00 PM}

但是框架查询 queryDtFrom 的值为

 (PartitionKey eq 'D4AS3') and (TimeReceived ge datetime'2018-06-18T11:30:00.0000000Z')

此处日期值更改为2018-06-18T11:30:00.0000000Z,而传递给TableQuery.GenerateFilterConditionForDate的值为{6/18/2018 5:00:00 PM}

我的要求

我们如何才能使使用 GenerateFilterConditionForDate 构建的查询在结果查询中具有相同的传递日期时间 而不是更改 UTC 时间值? 任何想法,请分享。

这是 Azure 中的设计。

它提倡以 UTC 时间存储,因为它是标准时间,您可以在其中计算任何其他时区。

我们可以在调用 TableQuery.GenerateFilterConditionForDate 之前先将本地时区时间转换为 UTC 时间,如下所示:

DateTime convertedDate = DateTime.SpecifyKind(DateTime.Parse("6/18/2018 5:00:00 PM"),DateTimeKind.Utc);

正如 Gaurav Mantri 在上面评论的那样:"This is expected behavior as all the date/time type attribute values are stored in UTC"。当我们从 table:

检索 UTC 格式的日期时间时,我们还可以将 UTC 时间转换为本地时区时间
DateTime dt = convertedDate.ToLocalTime();

如评论和其他答案中所述,这是 Azure 表的默认行为。所有 date/time 值都存储为 UTC。

同样,如评论中所述,如果您希望保留 date/time 值,一种可能的解决方案是获取 date/time 值的 ticks 并将该值存储为Int64 类型属性。在查询之前,您可以获得 date/time 的刻度值并将其用于查询目的。