Důvodem je, že formát BSON DateTime ukládá hodnoty s menší přesností než hodnota .NET DateTime, takže když ji čtete zpět z databáze, byla hodnota zkrácena.
Pokud je vaše hodnota DateTime vlastností třídy C#, kterou serializujete, můžete požádat serializátor, aby serializoval hodnotu DateTime jako vložený dokument obsahující jak hodnotu BSON DateTime (zkrácenou), tak původní hodnotu .NET DateTime (uloženou jako Ticks). V takovém případě nebude hodnota při deserializaci zkrácena.
Například:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Můžete také použít BsonRepresentation of Int64 nebo String a neztratit přesnost, ale pak uložený dokument pouze má Ticks nebo řetězcovou reprezentaci a žádný BSON DateTime, což ztěžuje provádění dotazů souvisejících s DateTime.
Měli byste také mít na paměti, že hodnoty DateTime jsou v databázi uloženy v UTC. Nejlepším postupem je vždy používat pro ukládání hodnoty UTC a při jejich zobrazování uživateli používat pouze místní časy.