2011-07-27 28 views
5

En mongodb, un campo llamado joining_date aparece comoComprobación de si un objeto de fecha y hora en mongodb está en formato UTC o no del pitón

"Sun Dec 19 2010 05:35:55 GMT+0000 (UTC)" 

Esta medida que se ve es una fecha GMT.

Pero el mismo campo cuando se accede desde pymongo aparece como

datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) 

De pitón que necesito para comprobar que la fecha está en formato UTC o no.

Problema: Tengo un resultado extraño como se muestra a continuación

v = datetime(2010, 12, 19, 5, 35, 55, 286000) 
v.tzinfo == pytz.utC# Returns False !..why ? 

¿Cómo puedo volver a la cadena original Sun Dec 19 2010 05:35:55 GMT+0000 (UTC) de datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) o cómo puedo comprobar si datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) está en formato UTC o no?

+0

¿su fecha está almacenada como una cadena o un objeto de fecha en mongodb? ¿puede Pymongo "ordenar" automáticamente la cadena en un objeto de fecha? – vgoklani

Respuesta

1

Para citar la documentación PyMongo:

Todos datetimes recuperados del servidor (no importa qué versión del controlador que está utilizando) será ingenuo y representar a UTC.

es decir v.tzinfo is None. Que habría sido advertido acerca de esto si hubieras intentado convertirlos a otra zona horaria:

>>> v.astimezone(pytz.timezone("US/Eastern")) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: astimezone() cannot be applied to a naive datetime 

Sin embargo, se puede obtener una zona horaria de fecha y hora al tanto haciendo datetime(v.year, v.month, v.day, v.hour, v.minute, v.second, v.microsecond, pytz.utc). En este caso, el código original funcionaría:

v = datetime(2010, 12, 19, 5, 35, 55, 286000, pytz.utc) 
v.tzinfo == pytz.utC# Returns True 
+6

No estoy seguro de qué versión de la documentación de pymongo está leyendo, pero desde 1.8, pymongo ha respaldado opcionalmente el regreso de 'datetime's con timezone-aware. En la versión actual (2.0), puede configurar esto al crear una 'Conexión' con el parámetro' tz_aware' (acepta booleano). Cuando 'tz_aware' es' True', todos los 'datetimes' todavía se devuelven en UTC, pero tienen' tzinfo' establecido en un desplazamiento fijo (de 0). – dcrosta

10

datetime objetos devueltos por pymongo siempre representan un momento en UTC, al igual que las fechas almacenados en MongoDB siempre se almacenan como (es decir, asume que están en) UTC.

pymongo puede convertir sus datetime s automáticamente de ser conscientes de zona horaria si se establece el indicador tz_info a True al crear su Connection. A continuación, puede usar el método datetime s astimezone() para convertir a otra zona horaria si lo desea.

+3

¿La bandera de 'tz_info' debe ser' tz_aware'? – alswl

+0

@alswl, '' 'tz_info''' debe ser cierto. –

Cuestiones relacionadas