我的问题
使用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时间值? 任何想法,请分享。
答案 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();