web-dev-qa-db-fra.com

Obtenir le décalage UTC de l'ordinateur en Python

En Python, comment trouvez-vous le décalage de l'heure UTC de l'ordinateur? 

40
Paul

gmtime() renverra l’heure UTC et localtime() renverra l’heure locale afin que la soustraction des deux donne le décalage utc.

30
jts

time.timezone :

import time

print -time.timezone

Il imprime le décalage UTC en secondes (pour prendre en compte l'heure d'été, voir time.altzone :

is_dst = time.daylight and time.localtime().tm_isdst > 0
utc_offset = - (time.altzone if is_dst else time.timezone)

où utc offset est défini via: "Pour obtenir l'heure locale, ajoutez utc offset à utc time."

Dans Python 3.3+, il existe tm_gmtoff attribut si la bibliothèque C sous-jacente le prend en charge:

utc_offset = time.localtime().tm_gmtoff

Remarque: time.daylight peut donner un résultat erroné dans certains cas Edge .

tm_gmtoff est utilisé automatiquement par date-heure s'il est disponible sur Python 3.3+:

from datetime import datetime, timedelta, timezone

d = datetime.now(timezone.utc).astimezone()
utc_offset = d.utcoffset() // timedelta(seconds=1)

Pour obtenir le décalage UTC actuel de manière à résoudre le problème time.daylight et que cela fonctionne même si tm_gmtoff n'est pas disponible, la suggestion de @ jts pour sous-structurer l'heure locale et l'heure UTC peut être utilisée:

import time
from datetime import datetime

ts = time.time()
utc_offset = (datetime.fromtimestamp(ts) -
              datetime.utcfromtimestamp(ts)).total_seconds()

Pour obtenir un décalage UTC pour les dates passées/futures, vous pouvez utiliser les fuseaux horaires pytz:

from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal

tz = get_localzone() # local timezone 
d = datetime.now(tz) # or some other local date 
utc_offset = d.utcoffset().total_seconds()

Cela fonctionne pendant les transitions DST, pour les dates passées/futures même si le fuseau horaire local avait un décalage UTC différent à l'époque, par exemple le fuseau horaire Europe/Moscou pour la période 2010-2015.

71
jfs

J'aime:

>>> strftime('%z')
'-0700'

J'ai d'abord essayé la réponse de JTS, mais elle m'a donné un résultat erroné. Je suis en -0700 maintenant, mais on disait que j'étais en -0800. Mais je devais faire une conversion avant de pouvoir obtenir quelque chose que je puisse soustraire, alors peut-être que la réponse était plus incomplète que incorrecte.

2
dstromberg
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60
1
Tilek

Créer un horodatage Unix avec le fuseau horaire corrigé UTC

Cette fonction simple vous aidera à obtenir l'heure actuelle à partir d'un objet date de la base de données MySQL/PostgreSQL.

def timestamp(date='2018-05-01'):
    return int(time.mktime(
        datetime.datetime.strptime( date, "%Y-%m-%d" ).timetuple()
    )) + int(time.strftime('%z')) * 6 * 6

Exemple de sortie

>>> timestamp('2018-05-01')
1525132800
>>> timestamp('2018-06-01')
1527811200
0
Stephen Blum