¿Cómo convertir una cadena consciente de zona horaria a datetime en python sin dateutil?
timezone rfc3339 (4)
Tengo que convertir una cadena sensible a la zona horaria al objeto python datetime.
Por ejemplo, "2012-11-01T04: 16: 13-04: 00".
Encuentro que hay un módulo de dateutil
que tiene una función de análisis para hacerlo, pero realmente no quiero usarlo ya que agrega una dependencia.
Entonces, ¿cómo puedo hacerlo? He intentado algo como lo siguiente, pero sin suerte.
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
Aquí está el Python Doc para el objeto datetime usando el paquete dateutil.
from dateutil.parser import parse
get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
Hay dos problemas con el código en la pregunta original: no debe haber un ":" en la zona horaria y la cadena de formato para "zona horaria como un desplazamiento" es minúscula "% z" no superior "% Z".
Esto funciona para mí en Python v3.6
>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00
No se puede, no sin una gran cantidad de minuciosa definición manual de la zona horaria.
Python no incluye una base de datos de zona horaria, porque estaría desactualizada demasiado rápido. En cambio, Python se basa en bibliotecas externas, que pueden tener un ciclo de lanzamiento mucho más rápido, para proporcionar zonas horarias configuradas correctamente para usted.
Como efecto secundario, esto significa que el análisis de zona horaria también debe ser una biblioteca externa. Si dateutil
es demasiado pesado para usted, utilice iso8601
en iso8601
lugar, analizará su formato específico muy bien:
>>> import iso8601
>>> iso8601.parse_date(''2012-11-01T04:16:13-04:00'')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset ''-04:00''>)
iso8601
es un iso8601
4KB pequeño. Compara python-dateutil
tot python-dateutil
dateutil.
A partir de Python 3.2 Python puede manejar zonas horarias simples basadas en desplazamiento, y %z
analizará -hhmm
y +hhmm
offsets de zona horaria en una marca de tiempo. Eso significa que para una marca de tiempo ISO 8601 debe eliminar :
en la zona horaria:
>>> from datetime import datetime
>>> iso_ts = ''2012-11-01T04:16:13-04:00''
>>> datetime.strptime(''''.join(iso_ts.rsplit('':'', 1)), ''%Y-%m-%dT%H:%M:%S%z'')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))
La falta de un análisis ISO 8601 adecuado se está rastreando en el problema 15873 de Python .
Soy nuevo en Python, pero encontré una forma de convertir
2017-05-27T07:20:18.000-04:00
a
2017-05-27T07:20:18
sin descargar nuevas utilidades.
from datetime import datetime, timedelta
time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04
item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)
Estoy seguro de que hay mejores formas de hacerlo sin cortar tanto la cuerda, pero esto hizo el trabajo.