2014-06-23 3 views
6

Y a-t-il quelqu'un qui peut m'aider à comprendre ce qui se passe ici?Pourquoi pytz localize() ne produit-il pas un objet datetime avec tzinfo correspondant à l'objet tz qui l'a localisé?

import pytz 
from datetime import datetime 
tz = pytz.timezone('Europe/Berlin') 
print repr(tz) 
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD> 
dt = datetime(2011, 1, 3, 18, 40) 
result = tz.localize(dt) 
print repr(result.tzinfo) 
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD> 
assert result.tzinfo == tz, "Why aren't these the same timezone?" 

Je crois comprendre que la méthode localize() sur un objet fuseau horaire pytz prendrait un objet datetime naïf, et ajouter une propriété tzinfo correspondant à l'objet de fuseau horaire effectuer la localisation. Cela ne semble pas se produire dans ce cas. De toute évidence, il y a quelque chose que je ne comprends pas à propos des fuseaux horaires, ou de la façon dont pytz gère les fuseaux horaires. Quelqu'un peut-il expliquer?

Répondre

7

Ils sont le même fuseau horaire - "Europe/Berlin". Lorsque vous les imprimez, la sortie inclut l'abréviation et le décalage qui s'appliquent à ce moment particulier.

Si vous examinez the tz data sources, vous verrez:

# Zone NAME   GMTOFF RULES  FORMAT [UNTIL] 
Zone Europe/Berlin 0:53:28 -   LMT  1893 Apr 
         1:00  C-Eur  CE%sT 1945 May 24 2:00 
         1:00  SovietZone CE%sT 1946 
         1:00  Germany  CE%sT 1980 
         1:00  EU   CE%sT 

Il semblerait que lorsque la zone de temps n'a pas localisé un datetime, il utilise juste la première entrée.

Il semblerait également que pytz ne conserve pas les 28 secondes supplémentaires de l'écart de temps moyen local d'origine - mais cela n'a pas d'importance, sauf si vous travaillez avec des dates à Berlin avant Avril 1893.

+0

Nous vous remercions de votre commentaire. Bonne prise sur le CET/CEST. C'était un mauvais copier-coller de ma part (maintenant édité). J'avais expérimenté à la fois une date de l'heure d'été et une date de non-heure d'été. J'ai essayé d'exécuter ceci sous Python 3.4 avec le plus récent pytz, et j'ai obtenu le même résultat. S'il vous plaît voir: https://gist.github.com/bjmc/59d8650ae3d2aebb7584 Vos informations sur la source de données tz est appréciée. Cela signifie-t-il que l'attribut 'tzinfo' d'une date localisée [moderne] ne serait jamais comparable à l'objet abstraite de timezone de pytz? – bjmc

+0

En général, je ne considérerais jamais qu'un 'tzinfo' serait comparable à un autre' tzinfo' sans une date et une heure spécifiques. Cependant, si vous savez que les deux objets proviennent de pytz (ou de [tzlocal] (https://pypi.python.org/pypi/tzlocal)), vous pouvez comparer leurs propriétés '.zone', qui contiennent simplement la chaîne de caractères l'identifiant de zone ("" Europe/Berlin "). –

+0

Je ne suis pas sûr que ce soit une réponse. C'est juste de répéter que c'est un problème. Le problème se produit lorsque vous essayez également de remplacer le tzinfo d'un objet datetime. –

Questions connexes