web-dev-qa-db-fra.com

python: documentation sur les noms de fuseau horaire datetime tzinfo

J'ai une date que je construis:

from datetime import datetime
from datetime import tzinfo
test = '2013-03-27 23:05'
test2 = datetime.strptime(test,'%Y-%m-%d %H:%M')
>>> test2
datetime.datetime(2013, 3, 27, 23, 5)

>>> test2.replace(tzinfo=EST)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'EST' is not defined

>> test2.replace(tzinfo=UTC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'UTC' is not defined

Je ne trouve pas de documentation sur la liste des fuseaux horaires names que je peux affecter à tzinfo dans l'appel replace.tzinfo=.

J'ai lu ce qui suit et il n'y a rien:

http://docs.python.org/2/library/datetime.html#tzinfo-objects

J'ai également recherché dans google.

Edit : J'ai suivi la solution fournie par unutbu mais j'obtiens ce qui suit:

>>> test = '2013-03-27 00:05'
>>> test
'2013-03-27 00:05'

>>> test2 = dt.datetime.strp(test, '%Y-%m-%d %H:%M')
>>> test2
datetime.datetime(2013, 3, 27, 0, 5)

>>> est = pytz.timezone('US/Eastern')
>>> utc = pytz.utc
>>> print(est.localize(test2))
2013-03-27 00:05:00-04:00
>>> print(utc.localize(test2))
2013-03-27 00:05:00+00:00

>>> print(est.localize(test2,is_dst=False))
2013-03-27 00:05:00-04:00
>>> print(est.localize(test2,is_dst=True))
2013-03-27 00:05:00-04:00
>>>

Comme vous pouvez le voir, même lorsque je fournis le drapeau is_dst =, le décalage est toujours "-04: 00", qui est EDT et non EST. J'apprécie l'aide. Je vous remercie.

La documentation montre les éléments suivants:

Si vous insistez pour travailler avec les heures locales, cette bibliothèque fournit une facilité pour les construire sans ambiguïté: http://pytz.sourceforge.net/#problems-with-localtime =

>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
>>> est_dt = eastern.localize(loc_dt, is_dst=True)
>>> edt_dt = eastern.localize(loc_dt, is_dst=False)
>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500

eastern a été défini plus tôt dans la documentation comme eastern = timezone('US/Eastern')

Cela semble indiquer que le is_dst= flag Devrait en outre spécifier si l'heure d'été est spécifiée ou non. J'apprécierais de l'aide pour savoir pourquoi cela ne fonctionne pas dans mon cas.

19
codingknob

La bibliothèque standard ne définit aucun fuseau horaire - du moins pas bien (l'exemple de jouet donné dans la documentation ne gère pas les problèmes subtils comme ceux mentionnés ici ). Pour les fuseaux horaires prédéfinis, utilisez le tiers module pytz .

import pytz
import datetime as DT

eastern = pytz.timezone('US/Eastern')
utc = pytz.utc
test = '2013-03-27 23:05'

Il s'agit d'un datetime "naïf":

test2 = DT.datetime.strptime(test, '%Y-%m-%d %H:%M')   
print(test2)
# 2013-03-27 23:05:00

Cela crée un datetime sensible au fuseau horaire en interprétant test2 comme s'il était dans le fuseau horaire EST:

print(eastern.localize(test2))
# 2013-03-27 23:05:00-04:00

Cela crée un datetime sensible au fuseau horaire en interprétant test2 comme s'il était dans le fuseau horaire UTC:

print(utc.localize(test2))
# 2013-03-27 23:05:00+00:00

Vous pouvez également convertir un datetime prenant en charge le fuseau horaire en un autre fuseau horaire à l'aide de la méthode astimezone:

test2_eastern = eastern.localize(test2)
print(test2_eastern.astimezone(utc))
# 2013-03-28 03:05:00+00:00
33
unutbu