2011-10-21 34 views
8

Supongamos que deseo consultar mongo en dateTime. Tengo dos variables de C# que representan el inicio y la fecha de finalización.IsoDate y DateTime en MongoDB usando C#

1) {20.10.2011 00:00:00}

2) {22.10.2011 00:00:00}

Ahora el BsonDateTime.Create (dateTime) los transformó a un BSON DateTime bien también:

1) 2011-10-20T00: 00: 00 MongoDB.Bson.BsonDateTime

2) 2011-10-22T00: 00: 00 MongoDB.Bson.BsonDateTime

Este es el código creando la fechaTi MES (_value es una cadena):

DateTime dateTime; 
bool parsed = DateTime.TryParse(_value, out dateTime); 
if (!parsed) 
    throw new FormatException("Wrong format for a query param"); 
return BsonDateTime.Create(dateTime); 

continuación, el siguiente código crea la consulta:

private QueryComplete MakeQuery(string key, BsonValue value) 
{ 
    if (_separatorType == ">=") 
     return Query.GTE(key, value); 
    if (_separatorType == "<=") 
     return Query.LTE(key, value); 
    return Query.EQ(key, value); 
} 

y hago obtener un valor tan extraña en una consulta:

"Sessions.End" : { "$gte" : ISODate("2011-10-19T21:00:00Z"), "$lte" : ISODate("2011-10-21T21:00:00Z") }, 

Bueno , Busco en Google ISODate pero no he encontrado ninguna razón por la cual deba cambiarse. ¿Está bien?

+1

Usted dice que tiene dos variables de C#, pero no se han mostrado cómo se inicializan o incluso lo tipo ellos son. Sospecho fuertemente que está en el corazón de las cosas, pero no podemos decirlo sin ver el código. Supongo que ha creado * local * DateTime values ​​en lugar de UTC. –

+0

@Jon Skeet, agregó el código para la creación de dateTime, ¿qué es un UTC? –

+0

Ver mi respuesta: siga el enlace para obtener una descripción de UTC. Básicamente, este es un problema de zona horaria, sospecho ... –

Respuesta

12

Creo que el problema es que DateTime.TryParse le está dando una DateTime con un Kind de Local ... mientras que la fecha ISO está siempre en UTC. Espero que parte del código de MongoDB convierta el DateTime local en uno en UTC. Es en gran parte no su culpa, básicamente, DateTime is a very confusing type.

Sospecho que si especificas DateTimeStyles.AssumeUniversal en tu código de análisis, hará lo que esperas.

(Enchufe desvergonzado: mi propio proyecto, Noda Time, hace que todo esto mucho más simple ...)

+0

Muchas gracias Jon, fue de gran ayuda y esta cosa universal es realmente confusa, me gustaría tener un mejor control de las fechas –

+1

mongodb siempre almacena el tiempo de datos como UTC, y mongodb C# driver que convierte a utc cuando guarda el valor y vuelve a lo local cuando lee el valor de db. –