Lý do là định dạng BSON DateTime lưu trữ các giá trị có độ chính xác thấp hơn giá trị .NET DateTime, vì vậy khi bạn đọc lại từ cơ sở dữ liệu, giá trị đã bị cắt bớt.
Nếu giá trị DateTime của bạn là thuộc tính của lớp C # mà bạn đang tuần tự hóa, bạn có thể yêu cầu trình tuần tự hóa giá trị DateTime dưới dạng tài liệu nhúng có chứa cả giá trị BSON DateTime (bị cắt ngắn) và giá trị .NET DateTime ban đầu (được lưu trữ dưới dạng Ticks). Trong trường hợp đó, giá trị sẽ không bị cắt bớt khi được deserialized.
Ví dụ:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Bạn cũng có thể sử dụng BsonRepresentation của Int64 hoặc String và không làm mất độ chính xác, nhưng sau đó tài liệu được lưu trữ chỉ có Ticks hoặc đại diện chuỗi và không có BSON DateTime, điều này khiến bạn khó thực hiện các truy vấn liên quan đến DateTime.
Bạn cũng sẽ muốn lưu ý rằng các giá trị DateTime được lưu trữ trong UTC trong cơ sở dữ liệu. Cách tốt nhất là luôn sử dụng các giá trị UTC để lưu trữ và chỉ sử dụng thời gian cục bộ khi hiển thị chúng cho người dùng.