str python datetime python-datetime python-dateutil

strftime to datetime python



Python datetime strptime() y strftime(): cómo preservar la información de la zona horaria (3)

Aquí está mi respuesta en Python 2.7

Imprimir la hora actual con la zona horaria

from datetime import datetime import tzlocal # pip install tzlocal print datetime.now(tzlocal.get_localzone()).strftime("%Y-%m-%d %H:%M:%S %z")

Imprimir hora actual con zona horaria específica

from datetime import datetime import pytz # pip install pytz print datetime.now(pytz.timezone(''Asia/Taipei'')).strftime("%Y-%m-%d %H:%M:%S %z")

Se imprimirá algo así como

2017-08-10 20:46:24 +0800

Vea el siguiente código:

import datetime import pytz fmt = ''%Y-%m-%d %H:%M:%S %Z'' d = datetime.datetime.now(pytz.timezone("America/New_York")) d_string = d.strftime(fmt) d2 = datetime.datetime.strptime(d_string, fmt) print d_string print d2.strftime(fmt)

la salida es

2013-02-07 17:42:31 EST 2013-02-07 17:42:31

La información de la zona horaria simplemente se perdió en la traducción.

Si cambio ''% Z'' a ''% z'', obtengo

ValueError: ''z'' is a bad directive in format ''%Y-%m-%d %H:%M:%S %z''

Sé que puedo usar python-dateutil , pero me pareció extraño que no pueda lograr esta característica simple en datetime y tenga que introducir más dependencia.


Desafortunadamente, strptime() solo puede manejar la zona horaria configurada por su sistema operativo, y solo como una compensación de tiempo, realmente. De la documentation :

El soporte para la directiva %Z se basa en los valores contenidos en tzname y si la daylight es verdadera. Debido a esto, es específico de la plataforma excepto para reconocer UTC y GMT que siempre se conocen (y se consideran zonas horarias que no son de horario de verano).

strftime() no admite oficialmente %z .

Estás atascado con python-dateutil para soportar el análisis de zona horaria, me temo.


Parte del problema aquí es que las cadenas generalmente utilizadas para representar zonas horarias no son realmente únicas. "EST" solo significa "America / New_York" para las personas en América del Norte. Esta es una limitación en la API C time, y la solución Python es ... para agregar funciones completas de TZ en alguna versión futura en cualquier momento, si alguien está dispuesto a escribir el PEP.

Puede formatear y analizar una zona horaria como un desplazamiento, pero pierde información de horario de verano / verano (por ejemplo, no puede distinguir "América / Phoenix" de "América / Los_Angeles" en el verano). Puede formatear una zona horaria como una abreviatura de 3 letras, pero no puede analizarla desde allí.

Si desea algo confuso y ambiguo, pero generalmente lo que desea, necesita una biblioteca de terceros como dateutil .

Si desea algo que no sea ambiguo, simplemente agregue el nombre tz real a la cadena de fecha y hora local y vuelva a dividirlo en el otro extremo:

d = datetime.datetime.now(pytz.timezone("America/New_York")) dtz_string = d.strftime(fmt) + '' '' + "America/New_York" d_string, tz_string = dtz_string.rsplit('' '', 1) d2 = datetime.datetime.strptime(d_string, fmt) tz2 = pytz.timezone(tz_string) print dtz_string print d2.strftime(fmt) + '' '' + tz_string

O ... a medio camino entre esos dos, ya está usando la biblioteca de pytz , que puede analizar (según algunas reglas de desambiguación arbitrarias pero bien definidas) formatos como "EST". Entonces, si realmente lo desea, puede dejar %Z in en el lado del formato, luego sacarlo y analizarlo con pytz.timezone() antes de pasar el resto a strptime .