Es posible, y si sí, cómo, para llegar a la zona de tiempo (es decir, el desplazamiento de UTC o un datetime.timezone instancia con offset) que es utilizado por datetime.datetime.fromtimestamp() para convertir un POSIX timestamp (segundos desde la época) a un datetime objeto?

datetime.datetime.fromtimestamp() convierte un POSIX marca de tiempo a un ingenuo datetime objeto (es decir, sin un tzinfo), pero lo hace mediante la configuración regional del sistema para que se ajuste a la zona horaria local y el desplazamiento de UTC que estaba en vigor en ese momento.

Por ejemplo, el uso de la fecha 2008-12-27 de la medianoche (UTC 40 * 356 * 86400 segundos desde la época):

>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)

Que marca de tiempo se convierte en un datetime objeto a la 1 de la mañana (que fue en ese tiempo, aquí en un CET/CEST zona horaria). 100 días más tarde, este es el resultado:

>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)

Que es de 2 de la mañana. Esto es debido a que por entonces, horario de verano se activa.

Yo esperaba que datetime.datetime.fromtimestamp() establecería el tzinfo se utiliza en la devuelve datetime ejemplo, pero no es así.

InformationsquelleAutor Feuermurmel | 2013-09-15

4 Comentarios

  1. 20

    datetime.fromtimestamp(ts) convierte «segundos desde la época de» ingenua de un objeto datetime que representa hora local. tzinfo es siempre None en este caso.

    Zona horaria Local pueden haber tenido diferentes desplazamiento de UTC en el pasado. En algunos sistemas que proporcionan acceso a un histórico de zona horaria de la base de datos, fromtimestamp() puede tomar en cuenta.

    Para obtener el desplazamiento de UTC utilizado por fromtimestamp():

    utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

    Ver también, Llegar del equipo desplazamiento de utc en Python.

    • Esto es en realidad lo que tendría que haber cuando me hizo la pregunta. Conocer las reglas de zona horaria no es importante, sólo el desplazamiento de UTC es suficiente para lo que yo estaba haciendo.
  2. 17

    De la Documentación de Python:

    classmethod datetime.fromtimestamp(timestamp, tz=None)

    De retorno de la fecha y hora local correspondiente a la POSIX marca de tiempo, como es devuelto por time.time(). Si el argumento opcional tz es None o no se especifica, la marca de hora se convierte a la plataforma en la fecha y hora local, y la devuelve datetime objeto es ingenuo.

    Más tz debe ser una instancia de una clase tzinfo subclase, y la marca de hora se convierte a tz‘s de la zona de tiempo. En este caso el resultado es equivalente a tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

    La parte clave de esta descripción se refiere a su pregunta es que, cuando no se especifique una hora de la zona, no sólo utiliza la zona horaria local, pero el resultado es ingenuo. Parece que quieren que sea consciente.

    Esta es una particular distinción hecha por Python, y se discute la derecha en la parte superior de la datetime documentación.

    Si lo que desea es una datetime que es consciente de la zona horaria local, pruebe el tzlocal de la biblioteca. Se centra en ese problema en particular. Véase también esta pregunta.

    • Sí, quiero una cuenta datetime objeto, pero estoy buscando una manera de hacer esto sin el uso de bibliotecas adicionales, como Python obviamente ya tiene acceso a la lógica necesaria para calcular el desplazamiento correcto de un POSIX de tiempo.
    • Que en realidad no la tienen en su propia. Se basa en el entorno de acogida para proporcionar la traducción. Ya que es específico de la plataforma, y diferentes plataformas tienen diferentes tz base de datos de implementaciones, no puede copiar las reglas de conversión de nuevo en un tzinfo objeto.
    • Sé que éste es el caso. Pero a través de la biblioteca de C se obtiene acceso a la lógica que se puede asignar un desplazamiento de UTC a un POSIX marca de tiempo que utilizan el sistema operativo de configuración (de lo contrario el código de la pregunta no iba a funcionar).
    • Exactamente. No se puede copiar en que la lógica de vuelta a un tzinfo objeto de python, por lo que nunca puede representar como un cuenta datetime. Es por eso que el tzlocal biblioteca intenta adivinar en la zona horaria de reglas. Se cuestiona el sistema operativo, pero, a continuación, asigna su propio valor tzinfo. No hay nada construido-en que iba a hacer eso.
    • no están disponibles en todas las plataformas. Y el tiempo.la zona horaria, el tiempo.tzname puede fallar por algunas de las zonas horarias. Ver el último eslabón en la mi respuesta. tzlocal devuelve pytz zona horaria que es la mejor opción para soluciones de plataforma cruzada. Además de las diferentes versiones de la tz de base de datos puede proporcionar diferentes definiciones mismo zona horaria — instalación de Python puro pytz módulo permite el control de la versión utilizada.
  3. 2

    Utilizando time.gmtime puede extraer de la zona horaria como se describe en esta respuesta anterior: Obtener TZ información del sistema en Python?.

    >>> from __future__ import print_function
    >>> from time import gmtime, strftime
    >>> print(strftime("%z", gmtime()))
    -0600

    Imprime -06:00 para mi portátil CST tanto en python 2.7 y python-3.3
    También puede utilizar localtime() para obtener la hora local struct.

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

    • No ha gustado a una respuesta específica (puede hacerlo haciendo clic en compartir debajo de una respuesta y copiar la url), que significan?
    • Usted probablemente significaba time.gmtime. En Python 3.3, se imprime time.struct_time(tm_year=2008, tm_mon=12, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=362, tm_isdst=0). Veo que no hay información de zona horaria.
    • Oh, usted probablemente significaba time.gmtime().tm_gmtoff! No funciona. Devuelve 0 en un sistema que se establece para CEST.
    • Dos notas: no tu primer ejemplo de impresión +0000, como gmtimes()‘s de la documentación indica que el devuelto struct_time en UTC? Y lt.tm_gmtoff parece ser la única manera que he encontrado hasta ahora, pero esto significa que localtime() tiene que ser llamado dos veces (una vez por datetime.fromtimestamp()) para crear una cuenta datetime instancia.
    • strftime("%z") imprime el desplazamiento de UTC para la zona horaria local cualquiera que sea el argumento, es decir, gmtime() no tiene nada que hacer con él
    • También desplazamiento de UTC en 40 * 356 * 86400 marca de tiempo puede ser diferente de la actual desplazamiento de UTC. Ytm_gmtoff no está disponible en todos los sistemas, consulte mi respuesta.

  4. 1

    Si conoces la zona horaria de la hora de registro que desea convertir, usted puede simplemente enviar al llamar fromtimestamp:

    >>> from datetime import datetime
    >>> import pytz
    >>>
    >>> datetime.fromtimestamp(1562684265, pytz.timezone("Europe/Stockholm"))
    datetime.datetime(2019, 7, 9, 16, 57, 45, tzinfo=<DstTzInfo 'Europe/Stockholm' CEST+2:00:00 DST>)
    >>>
    >>> datetime.fromtimestamp(1562684265, pytz.timezone("UTC"))
    datetime.datetime(2019, 7, 9, 14, 57, 45, tzinfo=<UTC>)

Dejar respuesta

Please enter your comment!
Please enter your name here