web-dev-qa-db-fra.com

Récupère le fuseau horaire utilisé par datetime.datetime.fromtimestamp ()

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.

26
Feuermurmel

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 .

20
jfs

De la documentation Python :

méthode de classedatetime.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 est None ou n'est pas spécifié, l'horodatage est converti en date et heure locales de la plate-forme et l'objet datetime 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 .

17
Matt Johnson-Pint

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

2
AChampion

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>)
1
Emil Stenström