2011-10-21 5 views
8

私はdateTimeでmongoに問い合わせたいとしましょう。私は、開始日と終了日を表す2つのC#変数を持っています。MongoDBのIsoDateとDateTimeをC#を使用して

1){2011年10月20日夜十二時00分00秒}

2){2011年10月22日夜十二時00分00秒}

今BsonDateTime.Create(dateTimeの)はBSON日時にそれらを転換十分すぎる:

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

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

これはdateTiを作成するコードMES(_valueは文字列です):

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); 
} 

と私は、クエリで、このような奇妙な値を得るか:

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

その後、次のコードは、クエリを構築しますまあ

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

、私はGoogleのISODateをシフトしなければならない理由が見つかりませんでした。大丈夫ですか?

+1

あなたは2つのC#の変数を持っていますが、あなたは彼らが初期化している方法を示す、あるいは何をしていないと言います彼らはタイプです。私は物事の中心にあると強く思っていますが、コードを見ずにはわかりません。私の推測では、あなたはUTCのものではなく* local * DateTimeの値を作成しています。 –

+0

@Jon Skeet、dateTime作成のコードを追加しました。これはUTCとは何ですか? –

+0

私の答えを見てください - UTCの説明についてはリンクをたどります。基本的にこれはタイムゾーンの問題です... –

答えて

12

私はこの問題は、ISOの日付がUTCに常にあるのに対しDateTime.TryParseは...あなたLocalKindDateTimeを与えていることであると信じています。私は、MongoDBコードの一部がローカルのDateTimeをUTCで1つに変換することを期待しています。主にではありません。あなたの責任は基本的にDateTime is a very confusing typeです。

あなたの解析コードにDateTimeStyles.AssumeUniversalを指定すると、疑わしいことが起こります。

(恥知らずなプラグイン:私自身のプロジェクト、Noda Timeは、このすべてがずっと簡単になります...)

+0

Jonさん、本当にありがとうございました。この普遍的なものは本当に混乱しています。私はより良いデータセットを手に入れたいです –

+1

mongodbは常にデータタイムをUTC、 mongodb c#ドライバは値を保存するときにutcに変換し、dbから値を読み込むときにはローカルに戻します。 –

関連する問題