2011-10-09 24 views
30

Estoy recibiendo mensajes de Twitter que se envían en una determinada fecha en el siguiente formato de Twitter:Yendo de la fecha de twitter para Python fecha de fecha y hora

Tue Mar 29 08:11:25 +0000 2011 

Quiero guardar estas fechas en la 'marca de tiempo con la zona horaria' campo en postgresql con el campo djangos DateTimeField. Cuando almaceno esa cadena sin embargo, me sale este error:

ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.'] 

puedo transformar automáticamente el DateType Twitter a la vez pitón de fecha y hora (que realiza un trabajo en otro lugar en mi aplicación para el ahorro de fechas).

Respuesta

54

Escribir algo así debería convertir una fecha de twitter en una marca de tiempo.

import time 

ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y')) 
2

puede convertir la fecha usando datetime.strptime(), o time.strptime(). sin embargo, esas dos funciones no pueden analizar el desplazamiento de la zona horaria (consulte this bug).

así, la única solución que veo es dividir la fecha usted mismo, eliminar el offset zona horaria, alimentar al resto de strptime(), y procesar el desplazamiento manualmente ...

echar un vistazo a this question, donde se encuentre algunos consejos sobre cómo analizar la compensación usted mismo.

11

Dale una oportunidad. Asume que el formato de fecha de Twitter cumple con RFC822 (vea la pregunta vinculada por @Adrien).

Se construye un objeto datetime ingenuo (es decir, no hay información de zona horaria). Se ajusta según el desplazamiento de la zona horaria a UTC. A menos que tenga la necesidad de conservar la zona horaria original, almacenaría la fecha y hora como formato UTC a la hora local cuando la muestre.

from datetime import datetime, timedelta 
from email.utils import parsedate_tz 

s = 'Tue Mar 29 08:11:25 +0000 2011' 

def to_datetime(datestring): 
    time_tuple = parsedate_tz(datestring.strip()) 
    dt = datetime(*time_tuple[:6]) 
    return dt - timedelta(seconds=time_tuple[-1]) 
+0

Prefiero este método porque incluso funciona con zonas horarias diferentes de +0000 (a pesar de que Twitter siempre usa +0000). El lado Django también es mejor para hacer que la zona horaria resultante sea compatible con la zona horaria utc (ver [esta pregunta] (http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone- aware-in-python)) – caipirginka

1

El siguiente código imprimirá una fecha agradable (hora local) a partir de una fecha de Twitter (UTC).

from datetime import datetime 
from datetime import timezone  

datetime.strptime(mydata["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
      tzinfo=timezone.utc).astimezone(tz=None).strftime('%Y-%m-%d %H:%M:%S'))