使用GenerateFilterConditionForDate框架的查询将时间更改为Azure表存储中的UTC时间

时间:2018-06-19 05:43:54

标签: c# azure 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构建一个查询,以便在结果查询中传递相同的dateTime 而不是改变UTC时间值? 任何想法,请分享。

2 个答案:

答案 0 :(得分:1)

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

再次,如注释中所述,如果您希望保留日期/时间值,一种可能的解决方案是获取日期时间值的ticks并将该值存储为Int64类型属性。在查询之前,您可以获取日期/时间的刻度值并将其用于查询目的。

答案 1 :(得分:0)

这是Azure中的设计。

它主张以UTC时间存储,因为它是您可以计算任何其他时区的标准时间。

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

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

正如Gaurav Mantri在上面评论的那样:"这是预期的行为,因为所有日期/时间类型属性值都存储在UTC"中。当我们从表格中检索UTC格式的日期时间时,我们也可以将UTC时间转换为本地区域时间:

DateTime dt = convertedDate.ToLocalTime();