2010-07-20 25 views
7

Estoy tratando de convertir una marca de tiempo de cadena en un objeto datetime adecuado. El problema que estoy teniendo es que hay una diferencia horaria y todo lo que hago no parece funcionar.Convertir la marca de tiempo de la cadena (con el desplazamiento de la zona horaria) a la hora local. . ? python

En última instancia, quiero convertir la marca de tiempo de la cadena en un objeto datetime en la zona horaria de mi máquina.

# string timestamp  
date = u"Fri, 16 Jul 2010 07:08:23 -0700" 
+1

¿Puedes publicar lo que tienes hasta ahora para el código? – bstpierre

Respuesta

8

El paquete dateutil es útil para la fecha de análisis/veces:

In [10]: date = u"Fri, 16 Jul 2010 07:08:23 -0700" 

In [11]: from dateutil.parser import parse 

In [12]: parse(date) 
Out[12]: datetime.datetime(2010, 7, 16, 7, 8, 23, tzinfo=tzoffset(None, -25200)) 

Por último, para convertir en tu hora local,

In [13]: parse(date).astimezone(YOUR_LOCAL_TIMEZONE) 
+0

¿cómo tomo esto y lo convierto en una representación de tiempo que coincide con mi zona horaria actual? y gracias por ese btw :) – alfredo

+0

Me alegro de ayudar. Puede usar el método 'astimezone' del objeto datetime que devuelve el análisis. Vea esta pregunta para más detalles: http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – ars

+0

Dateutil rocks! analicé mi cadena ("2013-10-22T21: 56: 00.000-03: 00") sin que tuviera que proporcionar una cadena de formato. – fccoelho

4

Parece que datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z') debería funcionar, pero de acuerdo a this bug report hay problemas con el procesamiento %z. Por lo que probablemente tiene que manejar la zona horaria por su cuenta:

import datetime 

d = u"Fri, 16 Jul 2010 07:08:23 -0700" 

d, tz_info = d[:-5], d[-5:] 
neg, hours, minutes = tz_info[0], int(tz_info[1:3]), int(tz_info[3:]) 
if neg == '-': 
    hours, minutes = hours * -1, minutes * -1 

d = datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S ') 
print d 
print d + datetime.timedelta(hours = hours, minutes = minutes) 
0

he aquí una solución stdlib:

>>> from datetime import datetime 
>>> from email.utils import mktime_tz, parsedate_tz 
>>> datetime.fromtimestamp(mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700"))) 
datetime.datetime(2010, 7, 16, 16, 8, 23) # your local time may be different 

Véase también, Python: parsing date with timezone from an email.

Nota: fromtimestamp() puede fallar si la zona horaria local tenía desplazamiento diferente en el pasado (2010) y si no utiliza una base de datos histórica sobre la zona horaria determinada plataforma UTC. Para solucionarlo, puede usar tzlocal.get_localzone(), para obtener un objeto tzinfo pytz que represente su zona horaria local. pytz proporciona acceso a la base de datos tz de manera portátil:

>>> timestamp = mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700")) 
>>> import tzlocal # $ pip install tzlocal 
>>> str(datetime.fromtimestamp(timestamp, tzlocal.get_localzone())) 
'2010-07-16 16:08:23+02:00' 
Cuestiones relacionadas