Est-il possible, et si oui, comment, d'obtenir le fuseau horaire (c'est-à-dire le décalage UTC ou une instance datetime.timezone
Avec ce décalage) qui est utilisé par datetime.datetime.fromtimestamp()
pour convertir un Horodatage POSIX (secondes depuis l'époque) vers un objet datetime
?
datetime.datetime.fromtimestamp()
convertit un horodatage POSIX en un objet naïf datetime
(c'est-à-dire sans tzinfo
), mais le fait en utilisant les paramètres régionaux du système pour l'ajuster au fuseau horaire local et à l'UTC compensation qui était en vigueur à ce moment-là.
Par exemple, en utilisant la date 2008-12-27 minuit UTC (40 * 356 * 86400 secondes depuis l'époque):
>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)
Cet horodatage est converti en un objet datetime
à 1 heure du matin (ce qu'il était à ce moment-là, ici dans un fuseau horaire CET/CEST). 100 jours plus tard, voici le résultat:
>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)
Ce qui est 2 heures du matin. En effet, DST était alors actif.
Je m'attendais à ce que datetime.datetime.fromtimestamp()
définisse tzinfo
qu'il utilise dans l'instance datetime
renvoyée, mais ce n'est pas le cas.
datetime.fromtimestamp(ts)
convertit "secondes depuis l'époque" en un objet datetime naïf qui représente l'heure locale. tzinfo
est toujours None
dans ce cas.
Le fuseau horaire local peut avoir eu un décalage UTC différent dans le passé. Sur certains systèmes qui donnent accès à une base de données de fuseau horaire historique, fromtimestamp()
peut en tenir compte.
Pour obtenir le décalage UTC utilisé par fromtimestamp()
:
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)
Voir aussi, Obtenir le décalage utc de l'ordinateur en Python .
De la documentation Python :
méthode de classe
datetime
.fromtimestamp
(timestamp, tz=None
)Renvoie la date et l'heure locales correspondant à l'horodatage POSIX, telles que renvoyées par
time.time()
. Si l'argument facultatif tz estNone
ou n'est pas spécifié, l'horodatage est converti en date et heure locales de la plate-forme et l'objetdatetime
retourné est naïf.Sinon tz doit être une instance d'une sous-classe de classe
tzinfo
, et l'horodatage est converti en tz fuseau horaire. Dans ce cas, le résultat est équivalent àtz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))
.
La partie clé de cette description par rapport à votre question est que lorsque vous ne spécifiez pas de fuseau horaire, non seulement il utilise le fuseau horaire local, mais le résultat est naïf. Vous semblez vouloir que ce soit conscient.
C'est une distinction particulière faite par Python, et est discutée tout en haut de la documentation datetime .
Si vous voulez un datetime
qui est conscient du fuseau horaire local, essayez la bibliothèque tzlocal . Il se concentre sur ce problème particulier. Voir aussi cette question .
En utilisant time.gmtime
vous pouvez extraire le fuseau horaire comme décrit dans cette réponse précédente: Obtenir les informations TZ du système en Python? .
>>> from __future__ import print_function
>>> from time import gmtime, strftime
>>> print(strftime("%z", gmtime()))
-0600
Imprime -06: 00 pour mon ordinateur portable CST en python-2.7 et python-3.3 Vous pouvez également utiliser localtime () pour obtenir une structure d'heure locale.
>>> 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
J'espère que cela t'aides
Si vous connaissez le fuseau horaire de l'horodatage que vous souhaitez convertir, vous pouvez simplement l'envoyer en appelant 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>)