【发布时间】:2017-01-04 16:59:15
【问题描述】:
我有包含 DateTimeOffset 值的 string 字段的文档。例如:
public class DateTimePocoDocument : Resource
{
public string startTime { get; set; }
public string endTime { get; set; }
}
想象一个字符串值被设置如下。
myDateTimePocoDocument.startTime = DateTimeOffset.UtcNow.ToString("o");
使用 .NET DocumentClient 在 DocumentDb 中创建文档。
public async Task<Document> InsertAsync(TDocument data)
{
return await Client.CreateDocumentAsync(Collection.SelfLink, data);
}
在 DocumentDb 中查看文档会显示正确存储的 字符串 字段。
[
{
"startTime": "2016-10-01T13:00:00.0000000+00:00",
"endTime": "2016-10-01T14:35:17.215947+00:00",
"id": "2b6e53e1-2099-41f8-8405-f9daf750cfc8",
"_rid": "6qt9AJ0xkgDkAwAAAAAAAA==",
"_self": "dbs/6qt9AA==/colls/6qt9AJ0xkgA=/docs/6qt9AJ0xkgDkAwAAAAAAAA==/",
"_etag": "\"3d00c96d-0000-0000-0000-586e67b40000\"",
"_attachments": "attachments/",
"_ts": 1483630513
}
]
我这样做是因为我想手动处理 DateTimeOffset 值的所有序列化和反序列化。当数据跨控制器移动、序列化到 Azure App 客户端、序列化到 SQLite 并返回等等时,我需要精确性和可预测性。
当我执行如下查询时:
Client.CreateDocumentQuery<TDocument>(Collection.DocumentsLink,
query,
new FeedOptions { EnableScanInQuery = true, EnableCrossPartitionQuery = false });
文档将上面的 startTime string 返回为“10/01/2016 13:00:00”。我创建了一个自定义 JsonConverter 并将其附加到属性以查看分配给 string 属性的内容。转换器确认将 DateTime 分配给字符串字段。 DocumentDb 客户端选择将字符串视为日期值,因为它看起来像日期。不幸的是,在这种情况下,这会导致字符串值发生变化。为什么它在我的字符串上执行该翻译,我怎样才能在不必自定义字符串的情况下防止这种情况发生?
谢谢
【问题讨论】:
-
我建议您将 DocumentDB 中的所有日期存储为带有 Zulu 时间的 ISO-8601 字符串(意味着没有偏移),所以
2016-10-01T13:00:00.000Z。这将保留您进行范围查询的能力。它可能需要您将用于编写这些查询的文字从用户时间转移到 Zulu 时间,但是有许多库可以为您做到这一点。 -
杰拉德,我怀疑 DocumentDB 会这样做,因为它将字符串视为字符串并且不应该执行任何此类修改。如果您的 POCO 包含 DateTimeOffset 属性,我可以想象显示为 10/01/2016 13:00:00,因为这是 DateTimeOffset 的默认反序列化设置。你能确认一下吗?另外,请提供 POCO 并告诉我们您是如何在 DocumentDB 中创建文档的。
-
根据要求,我添加了一个示例 POCO 以及如何创建文档。我不希望重点放在可搜索性上,因为我已经有了它,所以我从问题中删除了它。
-
感谢杰拉德提供的信息!我会尝试对此进行调试并尽快回复您。
标签: azure-cosmosdb