Solución:
El controlador c # de forma predeterminada (sin configuraciones adicionales) guarda las fechas locales como fecha utc en la base de datos (fecha – compensación de zona horaria) pero leyendo sin ninguna acción (por lo tanto, fecha utc).
Debido a esto, cuando carga la fecha y hora de la base de datos, recibe diff en 2 horas (su compensación de zona horaria). Hay dos enfoques sobre cómo decirle al controlador mongodb c # convertir las fechas utc en fechas de la zona horaria local durante la deserialización:
1.a través de los atributos para un campo de fecha particular:
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}
2.a través de la configuración global para todos los campos de fecha y hora (el valor predeterminado es UtcInstance
):
DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;
Una vez que hagas el n. ° 1 o el n. ° 2, verás la fecha local.
Actualizar:
# 2 está obsoleto en la última versión del controlador, así que use el código siguiente en su lugar:
BsonSerializer.RegisterSerializer(typeof(DateTime),
new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));
Actualizar:
# 2 ha cambiado de nuevo:
BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
Te encuentras con un problema de zona horaria. Su objeto de fecha probablemente esté en una zona horaria diferente a UTC (2 horas por delante por lo que parece) o su zona horaria predeterminada está configurada en algo diferente a UTC. El controlador convertirá la fecha a la zona horaria adecuada antes de almacenarla en la base de datos.
Normalmente no notaría esto ya que lo contrario (recuperar la fecha UTC de la base de datos) debería convertirlo de nuevo a la zona horaria original. Es posible que haya un problema con el controlador que está utilizando o que C # requiera un poco más de código para hacerlo bien.
El almacenamiento de fechas como cadenas no suele ser una buena idea, ya que deshabilita las consultas de rango en fechas.