2011-10-21 7 views
8

Załóżmy, że chcę zapytać o mongo na temat dateTime. Mam dwie zmienne C# reprezentujące datę początkową i końcową.IsoDate i DateTime w MongoDB przy użyciu C#

1) {20.10.2011 0:00:00}

2) {22.10.2011 0:00:00}

Teraz BsonDateTime.Create (dateTime) przekształca je do BSON DateTime a także:

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

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

to kod tworzący dateTi mes (_value jest ciągiem znaków):

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

Wtedy następny kod buduje zapytanie:

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

i mam dostać taką dziwną wartość w zapytaniu:

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

Dobrze , Google ISODate, ale nie znalazłem żadnego powodu, dla którego powinien on zostać przesunięty. Czy to jest w porządku?

+1

Mówisz, masz dwie zmienne C#, ale nie wykazały, w jaki sposób są one zainicjowany lub nawet co wpisz, jakie są. Podejrzewam, że to jest sedno rzeczy, ale nie możemy powiedzieć, nie widząc kodu. Domyślam się, że utworzyłeś * lokalne * wartości DateTime zamiast UTC. –

+0

@Jon Skeet, dodano kod do utworzenia dateTime, co to jest UTC? –

+0

Zobacz moją odpowiedź - kliknij link, aby wyświetlić opis UTC. Zasadniczo jest to problem strefy czasowej, podejrzewam ... –

Odpowiedz

12

Uważam, że problemem jest to, że DateTime.TryParse daje Ci DateTime z Kind z Local ... natomiast data ISO jest zawsze w UTC. Spodziewam się, że jakaś część kodu MongoDB konwertuje lokalny numer DateTime na jeden w czasie UTC. To w dużej mierze nie twoja wina - w zasadzie, DateTime is a very confusing type.

Podejrzewam, że podając kod parsujący podając DateTimeStyles.AssumeUniversal, zrobi to, czego oczekujesz.

(Shameless wtyczki: mój własny projekt, Noda Time, sprawia, że ​​wszystko to o wiele prostsze ...)

+0

Bardzo dziękuję Jon, pomogło i ta uniwersalna rzecz jest naprawdę zagmatwana, chciałbym uzyskać lepszą kontrolę nad datetimes –

+1

mongodb zawsze przechowywać datatime jako UTC, i mongodb C# driver konwersja do utc, gdy wartość save i powrót do lokalnego podczas odczytu wartości z db. –