2010-01-31 14 views
4

C'est un peu bizarre il me semble que quand je veux obtenir un fuseau horaire pour l'Europe/Paris avec pytz ça m'amène au fuseau horaire PMT au lieu de GMT + 1 quand ça a l'air de marcher pour l'Europe/Berlin.python-tz je me trompe ou c'est un bug

Pas clair? Eh bien regardez cet extrait:

#!/usr/bin/python 
import os 
import datetime 
from pytz.tzfile import build_tzinfo 

base='/usr/share/zoneinfo/' 
tz = build_tzinfo('Europe/Paris', 
        open(os.path.join(base,'Europe','Paris'), 'rb')) 
fmt = '%Y-%m-%d %H:%M:%S %Z%z' 
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt) 

tz = build_tzinfo('Europe/Berlin', 
        open(os.path.join(base,'Europe','Berlin'), 'rb')) 

print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt) 

la sortie est:

2009-01-30 09:00:00 PMT+0009 
2009-01-30 09:00:00 CET+0100 

quand vraiment paris devrait être aussi bien CET + 1.

Construire à partir de datetime.datetime.now (tz) obtiendrait la chose correcte, peu importe quoi.

Quelqu'un a une idée?

+0

double possible de [conversion datetime et le fuseau horaire avec pytz - esprit comportement soufflant] (http://stackoverflow.com/questions/18541051/datetime-and-timezone-conversion-with-pytz-mind-blowing-behaviour) – bain

+0

@bain probablement l'inverse :) –

Répondre

6

The docs que vous ne pouvez pas utiliser datetime.datetime(..., tzinfo) comme vous faites:

Malheureusement en utilisant l'argument tzinfo des constructeurs datetime standards ne fonctionne pas avec pytz pour de nombreux fuseaux horaires.

Et curieusement, malgré tous les signes que le fuseau horaire Europe/Paris est mauvaise, lorsque vous utilisez réellement avec localize comme il recommande, il fonctionne néanmoins:

>>> tz= pytz.timezone('Europe/Paris')    # using built-in zoneinfo 
>>> tz 
<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>   # what? Pierre et Miquelon Time? 
>>> datetime.datetime(2010,1,1,12,0,0, tzinfo=tz) 
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>) # bad 
>>> tz.localize(datetime.datetime(2010,1,1,12,0,0)) 
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>) # OK 

Notez que la propriété tzinfo des références datetime localisées un objet complètement différent du tz à partir duquel il a été créé, partageant uniquement le nom.

C'est un mystère pour moi pourquoi cela se produit. Il semble que ce soit un problème avec les fichiers de ville qui comprennent plusieurs noms de fuseaux horaires, mais pourquoi vous n'obtenez pas le fuseau horaire par défaut pour une ville jusqu'à ce que vous appelez localize, je ne sais pas.

(Pour être honnête, je ne l'ai jamais fait confiance à l'datetime Python et tzinfo choses Beaucoup préfèrent travailler avec horodatages int UTC..)

+1

Dans l'ensemble, les trucs de fuseau horaire de Python sont très mal conçus. Le concept de temps «naïfs» est inutile et extrêmement compliqué; il devrait y avoir seulement un type de datetime, et il devrait par défaut UTC, pas "inconnu" (naïf). –

Questions connexes