Obtenir le fuseau horaire utilisé par datetime.datetime.fromtimestamp()
Est-il possible, et si oui, comment, pour obtenir le fuseau horaire (c'est à dire le décalage UTC ou un datetime.timezone
exemple avec offset) qui est utilisé par datetime.datetime.fromtimestamp()
pour convertir un POSIX timestamp (secondes écoulées depuis l'époque) à un datetime
objet?
datetime.datetime.fromtimestamp()
convertit une POSIX timestamp pour un naïf datetime
objet (c'est à dire sans un tzinfo
), mais le fait en utilisant le système de paramètres régionaux afin de régler le fuseau horaire local et le décalage UTC qui était en vigueur à l'époque.
Par exemple, à l'aide de la date 2008-12-27 minuit (UTC 40 * 356 * 86400 secondes depuis l'epoch):
>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)
Que l'horodatage est converti en un datetime
objet à 1 heures du matin (ce qui n'était à l'époque, ici, dans une CET/CEST fuseau horaire). 100 jours plus tard, voici le résultat:
>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)
Qui est 2 heures du matin. C'est parce que d'ici là, l'heure d'été est active.
J'avais attendu que datetime.datetime.fromtimestamp()
serait le tzinfo
il utilise dans le retour de l' datetime
exemple, mais il ne le fait pas.
Vous devez vous connecter pour publier un commentaire.
datetime.fromtimestamp(ts)
convertit "de secondes depuis l'epoch" pour un naïf objet datetime qui représente l'heure locale.tzinfo
est toujoursNone
dans ce cas.Fuseau horaire Local ont peut-être eu un autre décalage UTC dans le passé. Sur certains systèmes qui permettent d'accéder à un historique de la base de données de fuseau horaire,
fromtimestamp()
peut le prendre en compte.Pour obtenir le décalage UTC utilisé par
fromtimestamp()
:Voir aussi, L'obtention de l'ordinateur décalage utc en Python.
De la La documentation Python:
La partie clé de cette description en ce qui concerne votre question, c'est que lorsque vous ne spécifiez pas une zone de temps, non seulement faut-il utiliser le fuseau horaire local, mais le résultat est naïf. Vous semblez vous voulez qu'il soit conscient.
C'est un particulier de la distinction faite par Python, et il est discuté à droite tout en haut de la date /heure de la documentation.
Si vous voulez une
datetime
qui est conscient de l'heure locale de la zone, essayez de le tzlocal de la bibliothèque. Il est axé sur ce problème en particulier. Voir aussi cette question.datetime
objet, mais je suis à la recherche d'un moyen de le faire sans l'aide des bibliothèques supplémentaires, comme Python évidemment a déjà accès à la logique nécessaire pour calculer le décalage correct à partir d'une POSIX timestamp.À l'aide de
time.gmtime
vous pouvez extraire le fuseau horaire, comme décrit dans cette précédente réponse: Obtenir TZ informations du système en Python?.Imprime -06:00 pour mon CST ordinateur portable dans les deux python 2.7 et python 3.3
Vous pouvez également utiliser localtime() pour obtenir l'heure locale struct.
Espère que cette aide
time.gmtime
. En Python 3.3, il imprimetime.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)
. Je ne vois pas les informations de fuseau horaire.time.gmtime().tm_gmtoff
! Il ne fonctionne pas. Il retourne0
sur un système qui est mis de CEST.+0000
, commegmtimes()
la documentation stipule que le retour de l'struct_time
est en UTC? Etlt.tm_gmtoff
semble être le seul moyen que j'ai trouvé jusqu'à présent, mais cela signifie quelocaltime()
doit être appelé deux fois (une fois pardatetime.fromtimestamp()
) pour créer un courantdatetime
instance.strftime("%z")
impressions de l'heure UTC offset pour le fuseau horaire local quel que soit l'argument, c'est à dire,gmtime()
n'a rien à faire avec elle40 * 356 * 86400
d'horodatage peut être différent de l'actuel décalage UTC. Ettm_gmtoff
n'est pas disponible sur tous les systèmes, voir ma réponse.Si vous connaissez le fuseau horaire de l'horodatage vous voulez convertir, vous pouvez tout simplement l'envoyer en appelant
fromtimestamp
: