2011-10-21 69 views
8

讓我們假設我想在dateTime上查詢mongo。我有兩個代表開始和結束日期的C#變量。使用C#在MongoDB中的IsoDate和DateTime

1){20.10.2011 00:00:00}

2){22.10.2011 00:00:00}

現在BsonDateTime.Create(日期時間)它們轉化爲BSON日期時間也很好:

1)2011-10-20T00:00:00 MongoDB.Bson.BsonDateTime

2)2011-10-22T00:00:00 MongoDB.Bson.BsonDateTime

這是代碼創建dateTi MES(_value是一個字符串):

DateTime dateTime; 
bool parsed = DateTime.TryParse(_value, out dateTime); 
if (!parsed) 
    throw new FormatException("Wrong format for a query param"); 
return BsonDateTime.Create(dateTime); 

那麼接下來的代碼生成查詢:

private QueryComplete MakeQuery(string key, BsonValue value) 
{ 
    if (_separatorType == ">=") 
     return Query.GTE(key, value); 
    if (_separatorType == "<=") 
     return Query.LTE(key, value); 
    return Query.EQ(key, value); 
} 

而且我在查詢中得到這樣一個奇怪的值:

"Sessions.End" : { "$gte" : ISODate("2011-10-19T21:00:00Z"), "$lte" : ISODate("2011-10-21T21:00:00Z") }, 

好,我谷歌ISODate,但沒有找到任何理由爲什麼它應該轉移。可以嗎?

+1

你說你有兩個C#的變量,但沒有表現出他們是如何初始化,甚至什麼鍵入它們。我強烈懷疑這是事情的核心,但我們無法看到代碼就無法分辨。我的猜測是你已經創建了* local * DateTime值而不是UTC。 –

+0

@Jon Skeet,添加了dateTime創建的代碼,什麼是UTC? –

+0

查看我的答案 - 按照UTC的說明進行操作。基本上這是一個時區問題,我懷疑... –

回答

12

我相信問題是DateTime.TryParse是給你一個DateTimeLocal一個Kind ...而ISO日期始終在UTC。我期望MongoDB代碼的某些部分將本地DateTime轉換爲UTC中的一個。這主要是而不是你的錯 - 基本上,DateTime is a very confusing type

我懷疑如果你在你的解析代碼中指定DateTimeStyles.AssumeUniversal,它會做你的期望。

(無恥插頭:我自己的項目,Noda Time,使這一切變得簡單許多......)

+0

非常感謝Jon,它確實有幫助,這個普遍的東西真的很混亂,我想更好地掌握日期時間 –

+1

mongodb總是將datatime存儲爲UTC,和mongodb c#驅動程序在保存值時轉換爲utc,並在從db讀取值時返回本地。 –

相關問題