在DocumentDB中保存和读取DateTimeOffset

3
我知道Date相关类型在DocumentDB中不被支持且被视为字符串。因此,我将我的一个属性保存成了2017-01-13T07:30:00+05:30这样的格式。当我在本地尝试读取时可以正常工作,但是一旦我将我的服务托管到Azure上,它就会转换为UTC时间(2017-01-13T02:30:00+00:00)。有什么原因呢?我认为我们可以将其保存并读取为字符串。是否是DateTimeOffset序列化引起的问题?
更新: 我注意到一件事情,当我更改本地系统时区并运行代码时,时区会转换为新时区的格式。因此,当我们从DocumentDB查询数据时,它会将时间转换为代码所在地的格式。
2个回答

1
这似乎是DocumentDb在使用JsonConvert反序列化标准ISO 8601格式的DateTimeOffset字符串时出现问题。基本上,他们会将时区转换为本地系统时区,并忽略字符串中的偏移信息。感谢您的回答。这就是DateTimeOffset的重点。对于Azure工作人员来说,这将是UTC。当然,在本地测试时,它使用您的本地时区并且正常工作(如果原始数据具有与您相同的偏移量)。设置JsonConvert.DefaultSettings也没有效果,因此在反序列化时必须明确设置设置。我在GITHUB提出了一个问题,但MS没有任何回应here。令我困惑的是,为什么没有其他人真正抱怨呢?这是DocumentDb的一个巨大的、严重的错误。我们用它来存储大约8000万个事件;日期非常重要,特别是当你有夏令时或跨时区的时候。这完全让人发疯,但这很典型的Microsoft。而我是一个粉丝!
使用这样的设置应该可以解决问题。由于我们只能通过DefaultSettings来实现这一点(在SDK中被显式设置的设置将覆盖它们),所以我们无法做太多事情。您可能会使用JsonConverter,我也正在调查。
new JsonSerializerSettings()
        {
            DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind,
            DateParseHandling = DateParseHandling.DateTimeOffset
        }

我在 Git 上为 Microsoft 提出了一个问题,他们承认这是一个 bug。因此,他们建议我在必要时将其保存为字符串并转换为 DateTimeOffset。但是,我将我的日期时间和偏移量分别保存为两个属性,并在发送数据到客户端之前将它们连接起来。Git 票 - Arjun Menon
谢谢。我有点惊讶文档中没有轻松提供此配置,我有点困惑从CosmosDB获取的值有一个1小时的偏移量... - ken2k

0

关于DateTime,我能给的最好建议就是使用

CultureInfo.InvariantCulture

对于 ParseExact 和 ToString,当您有一个确切的格式时使用。

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

我正在从应用程序接收带有偏移量的数据,并将其保存到文档数据库中。问题出现在当我尝试从文档数据库查询数据时。 - Arjun Menon
@ArjunMenon 参考这里 https://dev59.com/c47da4cB1Zd3GeqP7gbv - Midhun Mundayadan
1
我观察到一件事情,当我更改了本地系统的时区并运行它时,时间区域会转换为新的时区。 - Arjun Menon
1
这似乎是SDK中的一个错误,我会进行调查。您能指定使用它来读取的API吗?您可以将偏移量作为单独的字段存储作为解决方法。我相信它在DocumentDB中被正确存储,但在反序列化响应时存在问题。 - Rajesh Nagpal
我们正在使用.NET DocumentClient对象来获取和执行DocumentDB操作。 - Arjun Menon
@RajeshNagpal,似乎在保存到DocumentDB时出现了问题。 - Arjun Menon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接