2017-01-04 39 views
0

我有文檔字符串包含DateTimeOffset值的字段。例如:DocumentDb DateTimeOffset字符串

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 字符串返回爲「10/01/2016 13:00:00」。我創建了一個自定義的JsonConverter並將其附加到屬性,以查看字符串屬性的分配情況。轉換器確認DateTime正被分配給字符串字段。 DocumentDb客戶端選擇將字符串視爲日期值,因爲它看起來像日期。不幸的是,在這種情況下會導致字符串值改變。爲什麼它會在我的字符串上執行該翻譯,以及如何避免這種情況而無需自定義字符串?

感謝

+0

我建議您將DocumentDB中的所有日期存儲爲具有Zulu時間(意爲無偏移量)的ISO-8601字符串,因此「2016-10-01T13:00:00.000Z」。這將保留您進行範圍查詢的能力。它可能會要求您將用於編寫這些查詢的文字從用戶時間轉移到祖魯時間,但有許多庫可以幫助您做到這一點。 –

+0

Gerard,我懷疑DocumentDB會這樣做,因爲它將字符串視爲字符串,不應執行任何此類修改。如果您的POCO包含DateTimeOffset屬性,我可以想象顯示爲10/01/2016 13:00:00,因爲這是DateTimeOffset的默認反序列化設置。你能確認嗎?另外,請提供POCO並告訴我們如何在DocumentDB中創建Document。 –

+0

按照要求,我添加了一個示例POCO以及如何創建文檔。我不希望焦點在可搜索性上,因爲我已經有了,所以我將它從問題中刪除了。 –

回答

0

貌似Azure的宇宙DB不支持的DateTimeOffset類型呢。 這種支持的請求已經提交,可以跟蹤here

相關問題