2011-12-26 19 views
22

Tengo una aplicación de Django con un modelo que contiene un campo de tipo DateTimeField.
Estoy extrayendo datos de la web en el formato de 2008-04-10 11:47:58-05.
Creo que los últimos 3 caracteres en este ejemplo son la zona horaria.
¿Cómo puedo preservar esos datos en DateTimeField, y hay una conversión fácil entre los dos? Configurar DateTimeField para que simplemente contenga una cadena del formato anterior arroja un ValidationError.Analizando una cadena de fecha y hora en un Django DateTimeField

¡Gracias!

Respuesta

32

Usted puede utilizar

import dateutil.parser 
dateutil.parser.parse('2008-04-10 11:47:58-05') 

que devuelve una fecha y hora (que se pueden asignar a la DateTimeField).

+0

esto suena muy bien, pero en mi pitón 2.6.5 no hay datetime.parser o módulos datetime.datetime.parser (obtengo un ImportError). ¿Qué me estoy perdiendo? – user1094786

+0

AH mierda! Por supuesto, me refiero a "dateutil". ¡Publicación actualizada! – nisc

+0

Solo me pregunto, ¿funciona esto? – nisc

3

Si está utilizando formularios Django, puede especificar input_formats en su DateField. Ver la DateField documentation

Si estás interesado en analizar la información arbitraria fecha, se podría utilizar algo como parsedatetime y poner en práctica un método que Django llama a hacer el análisis antes de que golpee los validadores. (Ver this SO answer para un buen resumen de cómo funcionan y cuándo validaciones para insertarlos)

39

También puede usar Django's implementation. De hecho, lo preferiría y solo usaría algo más, si el analizador de Django no puede manejar el formato.

Por ejemplo:

>>> from django.utils.dateparse import parse_datetime 
>>> parse_datetime('2016-10-03T19:00:00') 
datetime.datetime(2016, 10, 3, 19, 0) 
>>> parse_datetime('2016-10-03T19:00:00+0200') 
datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>) 

tenerlo convertida a la zona horaria correcta cuando se conoce ninguno, utilice make_aware de django.utils.timezone.

Así que, finalmente, el analizador de utilidad sería:

from django.utils.dateparse import parse_datetime 
from django.utils.timezone import is_aware, make_aware 

def get_aware_datetime(date_str): 
    ret = parse_datetime(date_str) 
    if not is_aware(ret): 
     ret = make_aware(ret) 
    return ret 
+2

Esta debería ser la respuesta aceptada. –

+1

¡Sin embargo, me gustaría que los documentos especificaran exactamente lo que es una fecha 'bien formateada'! Esperaría que signifique RFC 1123, pero parece que no me gusta lo que mi navegador está enviando de vuelta ... –

+0

Esta respuesta no es correcta porque no se devuelve una fecha y hora reconocida de zona horaria, al menos no en 1.8.4. Puede intentarlo usted mismo 'desde django.utils import timezone, dateparse; timezone.is_aware (dateparse.parse_datetime ('2015-09-04 19:22:17')) ' y también ver en [fuente] (https://docs.djangoproject.com/en/1.8/_modules/django/utils/dateparse/# parse_datetime) que se devuelve un datetime.datetime. – Jmills

6

He estado usando esto:

from django.utils.timezone import get_current_timezone 
from datetime import datetime 
tz = get_current_timezone() 
dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y')) 
Cuestiones relacionadas