example - string to datetime python
Obtener la zona horaria utilizada por datetime.datetime.fromtimestamp() (3)
De la documentación de Python :
classmethod
datetime
.fromtimestamp
(timestamp, tz=None
)Devuelve la fecha y hora locales correspondientes a la marca de tiempo POSIX, como la que devuelve
time.time()
. Si el argumento opcional tz esNone
o no está especificado, la marca de tiempo se convierte a la fecha y hora locales de la plataforma, y el objeto dedatetime
ydatetime
devuelto es ingenuo.Else tz debe ser una instancia de una subclase
tzinfo
clase, y la marca de tiempo se convierte a la zona horaria de tz . En este caso, el resultado es equivalente atz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))
.
La parte clave de esta descripción en relación con su pregunta es que cuando no especifica una zona horaria, no solo utiliza la zona horaria local, sino que el resultado es ingenuo . Parece que quieres que sea consciente .
Esta es una distinción particular hecha por Python, y se discute en la parte superior de la documentación de fecha y hora .
Si lo que desea es una datetime
y datetime
que conoce la zona horaria local, pruebe la biblioteca tzlocal . Se centra en ese problema particular. Véase también esta pregunta .
¿Es posible, y si es así, cómo, obtener la zona horaria (es decir, el desplazamiento UTC o una instancia de datetime.timezone
con ese desplazamiento) que utiliza datetime.datetime.fromtimestamp()
para convertir una marca de tiempo POSIX (segundos desde la ¿Época) a un objeto datetime
?
datetime.datetime.fromtimestamp()
convierte una marca de hora POSIX en un objeto de datetime
ingenuo (es decir, sin tzinfo
), pero lo hace usando la configuración regional del sistema para ajustarlo a la zona horaria local y al desplazamiento UTC que estaba vigente en ese momento.
Por ejemplo, utilizando la fecha 2008-12-27 medianoche UTC (40 * 356 * 86400 segundos desde la época):
>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)
Esa marca de tiempo se convierte en un objeto de datetime
y datetime
a la 1:00 de la mañana (que era en ese momento, aquí en una zona horaria CET / CEST). 100 días después, este es el resultado:
>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)
Que son las 2 de la mañana. Esto es porque para entonces, DST estaba activo.
Esperaba que datetime.datetime.fromtimestamp()
configurara el tzinfo
que usa en la instancia de datetime
devuelta, pero no lo hace.
Usando time.gmtime
puede extraer la zona horaria como se describe en esta respuesta anterior: ¿ Obtener información TZ del sistema en Python? .
>>> from __future__ import print_function
>>> from time import gmtime, strftime
>>> print(strftime("%z", gmtime()))
-0600
Imprime -06: 00 para mi computadora portátil CST tanto en python-2.7 como en python-3.3 También puede usar localtime () para obtener una estructura de hora local.
>>> from __future__ import print_function
>>> from time import localtime
>>> lt = localtime()
>>> print(lt.tm_zone)
"CDT"
>>> print(lt.tm_gmtoff/(60*60))
-5.0
>>> print(lt.tm_gmtoff/(60*60) - (1 if lt.tm_isdst == 1 else 0)) # Adjusted for DST
-6.0
Espero que esto ayude
datetime.fromtimestamp(ts)
convierte "segundos desde la época" en un objeto de fecha y hora ingenuo que representa la hora local. tzinfo
siempre es None
en este caso.
La zona horaria local puede haber tenido un desplazamiento UTC diferente en el pasado. En algunos sistemas que proporcionan acceso a una base de datos histórica de zona horaria, fromtimestamp()
puede tenerlo en cuenta.
Para obtener el desplazamiento UTC utilizado por fromtimestamp()
:
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)
Consulte también, Obtención del desplazamiento de utc de la computadora en Python .