web-dev-qa-db-fra.com

Comment obtenir le nom commun d'un fuseau horaire pytz, par exemple. EST / EDT pour l'Amérique / New_York

Étant donné un fuseau horaire pytz pour un utilisateur particulier (calculé à partir de son décalage), je souhaite afficher le nom commun de ce fuseau horaire. Je suppose que les gens sont plus habitués à voir EST ou PST au lieu de l'orthographe comme America/NewYork.

Est-ce que pytz me donne ces noms standard quelque part, ou devrais-je le faire manuellement via une table? Cela pourrait potentiellement devenir désordonné, car par exemple, les lieux sont EST dans une saison et passent à montrer EDT pendant d'autres.

35
Sidmitra

Étant donné un fuseau horaire pytz pour un utilisateur particulier (calculé à partir de son décalage), je souhaite afficher le nom commun de ce fuseau horaire. Je suppose que les gens sont plus habitués à voir EST ou PST au lieu d'être énoncés comme America/NewYork.

Si vous en avez besoin dérivé d'un objet datetime localisé avec pytz...

>>> import pytz as tz
>>> from datetime import datetime as dt
>>> CT = tz.timezone('America/Chicago')
>>>
>>> summer_day = dt(2010, 7, 4, 0, 1, 1)
>>> bar = CT.localize(summer_day, is_dst=None)
>>> bar.tzname()
'CDT'
>>>
>>> christmas = dt(2010, 12, 25, 0, 1, 1)
>>> foo = CT.localize(christmas, is_dst=None)
>>> foo.tzname()
'CST'
>>> 
37
Mike Pennington

Vous pouvez utiliser la méthode tzname() des instances tzinfo:

>>> tz = timezone('America/St_Johns')
>>> normal = datetime(2009, 9, 1)
>>> tz.tzname(normal, is_dst=False)
'NDT'
6

Si vous recherchez les abréviations, il y a quelques façons qui vous viennent à l'esprit.

Le premier serait:

>>> from pytz import timezone
>>> eastern = timezone('US/Eastern')
>>> eastern._tzname
'EST'

Bien que cela fasse référence à une propriété avec le soulignement unique précédent, il peut être considéré comme privé et peut-être pas le meilleur endroit pour l'attraper. L'autre proviendrait d'un objet datetime localisé.

>>> from datetime import datetime
>>> loc_dt = eastern.localize(datetime.now())
>>> loc_dt.strftime('%Z')
'EST'
4
Philip Southam

Ce n'était peut-être pas le cas lorsque cette question a été rédigée à l'origine, mais voici un extrait pour obtenir la désignation officielle du fuseau horaire:

>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'

En outre, cela peut être utilisé avec un objet datetime non naïf (alias un datetime où le fuseau horaire réel a été défini à l'aide de pytz.<timezone>.localize(<datetime_object>) ou datetime_object.astimezone(pytz.<timezone>) comme suit:

>>> import datetime, pytz
>>> todaynow = datetime.datetime.now(tz=pytz.timezone('US/Hawaii'))
>>> todaynow.tzinfo # turned into a string, it can be split/parsed
<DstTzInfo 'US/Hawaii' HST-1 day, 14:00:00 STD>
>>> todaynow.strftime("%Z")
'HST'
>>> todaynow.tzinfo.zone
'US/Hawaii'

C'est, bien sûr, pour l'édification des utilisateurs de moteurs de recherche qui ont atterri ici. ... Voir plus sur le site du module pytz .

1
ingyhere