Nella maggior parte dei casi si desidera memorizzare le date e gli orari UTC nel database, quindi DateTime dovrebbe essere costruito come:-
DateTest = new DateTime(2013, 10, 13, 0, 0, 0, DateTimeKind.Utc) //this is the date
Con questo ora passa il primo dei tuoi unit test commentati.
Senza specificare il DateTimeKind
lo stai lasciando al caso. MongoDB sembra presumere che sia locale e lo converte in UTC nel database.
Si noti inoltre che i valori di MongoDB DateTime hanno una precisione inferiore rispetto ai valori di .NET DateTime. Se desideri archiviare valori DateTime arbitrari e recuperarli in modo tale che corrispondano ancora, dovrai arrotondarli al millisecondo più vicino prima di memorizzarli.
Se vuoi davvero memorizzare l'ora locale, ti consiglio di passare da DateTime
a DateTimeOffset
e serializzalo come un valore Tick lungo per DateTime UTC e un valore per l'offset.
Si noti che a meno che non si memorizzi l'offset calcolato nel momento in cui è stato ottenuto il valore DateTime, i metodi .NET per la conversione in LocalTime sono essenzialmente inutili poiché non sanno quando è iniziata l'ora legale, né sanno nemmeno in quale zona arriva il valore DateTime da. Nel complesso, la gestione di .NET DateTime lascia molto a desiderare e contiene molti metodi fuorvianti che affermano di essere d'aiuto ma in realtà non lo fanno.