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 entzname
y si ladaylight
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
.