Python: comment convertir datetime/timestamp d'un fuseau horaire à un autre?

plus précisément, étant donné le fuseau horaire de mon serveur (perspective de l'heure du système) et une entrée de fuseau horaire, Comment puis-je calculer l'heure du système comme si elle était dans ce nouveau fuseau horaire (indépendamment de l'heure d'été, etc.)?

import datetime
current_time = datetime.datetime.now() #system time

server_timezone = "US/Eastern"
new_timezone = "US/Pacific"

current_time_in_new_timezone = ???
9
demandé sur kfan 2015-08-13 03:23:22

2 réponses

si vous connaissez votre fuseau horaire d'origine et le nouveau fuseau horaire dans lequel vous souhaitez le convertir, utilisez d'abord pytz.localize pour gérer toute localisation (par exemple pour l'heure d'été, etc), puis utilisez pytz.timezone pour créer des objets timezone, et enfin utilisez datetime.astimezone(timezone) pour un calcul facile. Par exemple:

import datetime
import pytz # new import

my_timestamp = datetime.datetime.now() # some timestamp
old_timezone = pytz.timezone("US/Eastern")
new_timezone = pytz.timezone("US/Pacific")

# returns datetime in the new timezone
my_timestamp_in_new_timezone = old_timezone.localize(my_timestamp).astimezone(new_timezone) 

Et bien sûr, si tout ce que vous voulez, c'est l'heure d'un fuseau horaire spécifique, vous pouvez passer ce fuseau horaire directement dans datetime.maintenant() pour obtenir le timestamp. Comme ceci:

datetime.datetime.now(new_timezone)

maintenant, avec tout ce qui est dit, je recommande fortement de stocker tous vos horodateurs dans UTC comme une norme de système, et d'éviter l'ensemble du problème DST. Pour le contexte, voir: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove /

et pour savoir combien il est difficile de traiter les calculs de temps en général: http://yourcalendricalfallacyis.com

11
répondu kfan 2017-08-09 16:58:09

comment convertissez-vous datetime/timestamp d'un fuseau horaire à un autre fuseau horaire?

il y a deux étapes:

  1. créer des objets datetime conscients à partir de l'heure du système et du fuseau horaire par exemple, pour obtenir l'heure du système dans le fuseau horaire donné:

    #!/usr/bin/env python
    from datetime import datetime
    import pytz
    
    server_timezone = pytz.timezone("US/Eastern")
    server_time = datetime.now(server_timezone) # you could pass *tz* directly
    

    Note: datetime.now(server_timezone) fonctionne même pendant les périodes ambiguës par exemple, pendant les transitions DST alors que server_timezone.localize(datetime.now()) peut échouer (50% de chance).

    si vous êtes sûr que votre temps d'entrée existe dans le fuseau horaire du serveur et qu'il est unique, vous pouvez passer is_dst=None pour affirmer que:

    server_time = server_timezone.localize(naive_time, is_dst=None)
    

    il soulève une exception pour les temps invalides.

    S'il est acceptable d'ignorer jusqu'à par jour erreur (Bien que généralement une erreur due à DST est d'environ une heure ) alors vous pouvez laisser tomber is_dst paramètre:

    server_time = server_timezone.normalize(server_timezone.localize(naive_time))
    

    .normalize() est appelé pour ajuster les heures non-existantes (heure locale dans l'intervalle, pendant les transitions "spring forward"). Si les règles du fuseau horaire n'ont pas changé, votre serveur ne devrait pas générer de temps non-existant. Voir " puis-je toujours définir is_dst=True?"

  2. Convertir un courant datetime objet de la cible fuseau horaire tz :

    tz = pytz.timezone("US/Pacific")
    server_time_in_new_timezone = server_time.astimezone(tz)
    
3
répondu jfs 2017-05-23 11:53:08