W większości przypadków chcesz przechowywać daty UTC w bazie danych, więc Twój DateTime powinien być skonstruowany jako:-
DateTest = new DateTime(2013, 10, 13, 0, 0, 0, DateTimeKind.Utc) //this is the date
Dzięki temu pierwszy z twoich skomentowanych testów jednostkowych teraz przeszedł.
Bez określania DateTimeKind
pozostawiasz to przypadkowi. MongoDB wydaje się zakładać, że jest ona lokalna i konwertuje ją na UTC w bazie danych.
Należy również zauważyć, że wartości MongoDB DateTime mają mniejszą dokładność niż wartości DateTime platformy .NET. Jeśli chcesz przechowywać dowolne wartości DateTime i odzyskać je w taki sposób, aby nadal były zgodne, musisz zaokrąglić je do najbliższej milisekundy przed ich zapisaniem.
Jeśli naprawdę chcesz przechowywać lokalne czasy, polecam przełączyć się z DateTime
do DateTimeOffset
i zserializuj go jako długą wartość Tick dla daty i godziny UTC oraz wartość dla przesunięcia.
Zwróć uwagę, że jeśli nie przechowujesz przesunięcia obliczonego w momencie uzyskania wartości DateTime, metody .NET do konwersji na czas lokalny są zasadniczo bezużyteczne, ponieważ nie wiedzą, kiedy rozpoczął się czas letni, ani nawet nie wiedzą, w jakiej strefie pojawia się wartość DateTime z. Ogólnie rzecz biorąc, obsługa .NET DateTime pozostawia wiele do życzenia i zawiera wiele wprowadzających w błąd metod, które twierdzą, że pomagają, ale tak naprawdę nie są.