python datetime timezone rfc3339

¿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.