web-dev-qa-db-fra.com

Python obtenir l'heure actuelle dans le fuseau horaire correct

Maintenant j'utilise

import datetime
print(datetime.datetime.now().strftime("%X"))

pour afficher l'heure actuelle sous forme de chaîne.
Le problème, c'est que mon ordinateur tourne sous Europe/Berlin fuseau horaire et le décalage de +2 par rapport à UTC n’est pas comptabilisé ici. Au lieu de 19:22:26 il devrait afficher 21:22:26 Également différent des autres réponses que j'ai trouvées ici, je ne l'enregistre pas en appelant

datetime.datetime(2014, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)

mais

datetime.datetime.now()

alors j'ai essayé (et j'ai échoué) ce qui suit:

>>> from pytz import timezone
>>> datetime.datetime.now().astimezone(timezone('Europe/Berlin'))
 ValueError: astimezone() cannot be applied to a naive datetime


Modifier:

Répondre

Ne peut pas poster comme réponse, car cette question est marquée comme fermée

Le serveur avec lequel j'ai eu ce problème n'existe plus. Quoi qu'il en soit, voici quelques autres points à vérifier:

  • Le fuseau horaire de votre serveur/système est-il correctement configuré?
    • Les machines virtuelles ou les conteneurs de menu fixe peuvent ne pas être synchronisés avec l'hôte, cela vaut la peine de vérifier.
  • L'heure sur cet ordinateur est-elle correcte? Vous n'avez pas fini avec 2 heures après le changement de fuseau horaire?
49
luckydonald

Pour obtenir l'heure actuelle dans le fuseau horaire local en tant qu'objet date-heure naïf:

from datetime import datetime
naive_dt = datetime.now()

S'il ne renvoie pas l'heure prévue, cela signifie que votre ordinateur est mal configuré. Vous devriez le réparer en premier (il n’a aucun lien avec Python).

Pour obtenir l'heure actuelle en UTC en tant qu'objet datetime naïf:

naive_utc_dt = datetime.utcnow()

Pour obtenir l’heure actuelle en tant qu’objet datetime conscient dans Python 3.3+:

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc) # UTC time
dt = utc_dt.astimezone() # local time

Pour obtenir l'heure actuelle dans le fuseau horaire indiqué à partir de la base de données tz:

import pytz

tz = pytz.timezone('Europe/Berlin')
berlin_now = datetime.now(tz)

Cela fonctionne pendant les transitions DST. Cela fonctionne si le fuseau horaire avait un décalage UTC différent dans le passé, c'est-à-dire qu'il fonctionne même si le fuseau horaire correspond à plusieurs objets tzinfo à des moments différents.

96
jfs