Je voudrais savoir quelles sont toutes les valeurs possibles pour l'argument de fuseau horaire dans la bibliothèque Python pytz. Comment faire?
ssl.cert_time_to_second()
ASN1_TIME_print()
Je voudrais savoir quelles sont toutes les valeurs possibles pour l'argument de fuseau horaire dans la bibliothèque Python pytz. Comment faire?
ssl.cert_time_to_second()
ASN1_TIME_print()
Réponses:
Vous pouvez répertorier tous les fuseaux horaires disponibles avec pytz.all_timezones
:
In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]:
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
...]
Il y a aussi pytz.common_timezones
:
In [45]: len(pytz.common_timezones)
Out[45]: 403
In [46]: len(pytz.all_timezones)
Out[46]: 563
'Asia/Shanghai'
.
(datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()
(le résultat n'est pas -28800). J'éviterai pytz— dateutil.tz fournit des fonctionnalités similaires mais utilise la base de données de fuseau horaire du système d'exploitation et n'a pas de tels problèmes.
Ne créez pas votre propre liste - pytz
a un ensemble intégré:
import pytz
set(pytz.all_timezones_set)
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}
Vous pouvez ensuite appliquer un fuseau horaire :
import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Ou si vous avez déjà un datetime
objet qui est conscient de TZ (pas naïf):
# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)
# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)
>>> new_ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Le nom du fuseau horaire est le seul moyen fiable de spécifier le fuseau horaire.
Vous pouvez trouver une liste de noms de fuseau horaire ici: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Notez que cette liste contient beaucoup de noms d'alias, tels que US / Eastern pour le fuseau horaire qui est correctement appelé America / New_York.
Si vous souhaitez créer cette liste par programme à partir de la base de données zoneinfo, vous pouvez la compiler à partir du fichier zone.tab dans la base de données zoneinfo. Je ne pense pas que pytz ait une API pour les obtenir, et je ne pense pas non plus que ce serait très utile.
Ici, liste Python des codes de pays, noms, continents, capitales et fuseaux horaires pytz.
countries = [
{'timezones': ['Europe/Paris'], 'code': 'FR', 'continent': 'Europe', 'name': 'France', 'capital': 'Paris'}
{'timezones': ['Africa/Kampala'], 'code': 'UG', 'continent': 'Africa', 'name': 'Uganda', 'capital': 'Kampala'},
{'timezones': ['Asia/Colombo'], 'code': 'LK', 'continent': 'Asia', 'name': 'Sri Lanka', 'capital': 'Sri Jayewardenepura Kotte'},
{'timezones': ['Asia/Riyadh'], 'code': 'SA', 'continent': 'Asia', 'name': 'Saudi Arabia', 'capital': 'Riyadh'},
{'timezones': ['Africa/Luanda'], 'code': 'AO', 'continent': 'Africa', 'name': 'Angola', 'capital': 'Luanda'},
{'timezones': ['Europe/Vienna'], 'code': 'AT', 'continent': 'Europe', 'name': 'Austria', 'capital': 'Vienna'},
{'timezones': ['Asia/Calcutta'], 'code': 'IN', 'continent': 'Asia', 'name': 'India', 'capital': 'New Delhi'},
{'timezones': ['Asia/Dubai'], 'code': 'AE', 'continent': 'Asia', 'name': 'United Arab Emirates', 'capital': 'Abu Dhabi'},
{'timezones': ['Europe/London'], 'code': 'GB', 'continent': 'Europe', 'name': 'United Kingdom', 'capital': 'London'},
]
Pour la liste complète: Gist Github
J'espère que cela aide.
Ils semblent être remplis par les fuseaux horaires de la base de données tz trouvés ici .
pytz
donne accès à la base de données tz (c'est la source des données wikipedia).
EDIT: Je vous serais reconnaissant si vous ne votez pas plus bas cette réponse. Cette réponse est fausse , mais je préfère la conserver comme note historique. Bien qu'il soit discutable que l'interface pytz soit sujette aux erreurs, elle peut faire des choses que dateutil.tz ne peut pas faire, en particulier en ce qui concerne l'heure d'été dans le passé ou dans le futur. J'ai honnêtement enregistré mon expérience dans un article "Fuseaux horaires en Python" .
Si vous êtes sur une plate-forme de type Unix, je vous suggère d'éviter pytz et de regarder juste / usr / share / zoneinfo. dateutil.tz peut utiliser ces informations.
Le morceau de code suivant montre le problème que pytz peut poser. J'ai été choqué quand je l'ai découvert. (Curieusement, le pytz installé par yum sur CentOS 7 ne présente pas ce problème.)
import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
.total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
.total_seconds())
-29160.0
-28800.0
C'est-à-dire que le fuseau horaire créé par pytz correspond à l'heure locale vraie, au lieu de l'heure locale standard que les gens observent. Shanghai est conforme à +0800 et non à +0806 comme suggéré par pytz:
pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
EDIT: Merci au commentaire et au downvote de Mark Ransom, maintenant je sais que j'utilise pytz dans le mauvais sens. En résumé, vous n'êtes pas censé transmettre le résultat de pytz.timezone(…)
à datetime
, mais devez transmettre le datetime
à sa localize
méthode.
Malgré son argument (et mon mal de ne pas avoir lu la documentation pytz plus attentivement), je vais garder cette réponse. Je répondais à la question dans un sens (comment énumérer les fuseaux horaires pris en charge, mais pas avec pytz), car je pensais que pytz n'avait pas fourni de solution correcte. Bien que ma croyance soit fausse, cette réponse fournit toujours des informations, à mon humble avis, qui sont potentiellement utiles aux personnes intéressées par cette question. La manière correcte de faire de Pytz est contre-intuitive. Heck, si le tzinfo créé par pytz ne doit pas être utilisé directement par datetime
, il doit être d'un type différent. L'interface pytz est tout simplement mal conçue. Le lien fourni par Mark montre que de nombreuses personnes, pas seulement moi, ont été induites en erreur par l'interface pytz.
pytz
, vous l'utilisez mal. PS Ce n'est pas une réponse à la question du tout .
datetime
interface qui ne va pas pytz
. datetime
n'a pas anticipé les objets de fuseau horaire intelligents , donc son interface ne les initialise pas correctement.
datetime
fait partie de la bibliothèque Python standard, et c'est pytz qui devrait suivre l' datetime
interface, et non l'inverse. Si quelqu'un pouvait implémenter une interface comme il le pense mieux sans consensus, il n'y aurait pas de logiciel robuste.
pytz
ne peux pas suivre l' datetime
interface car l' datetime
interface est déficiente. Les auteurs de cette interface n'ont pas anticipé les problèmes d'un fuseau horaire dont les paramètres changent au fil des ans. Ce n'est pas parce qu'il fait partie de la distribution Python standard qu'il est parfait.
À mon avis, c'est un défaut de conception de la bibliothèque pytz. Il devrait être plus fiable de spécifier un fuseau horaire en utilisant le décalage, par exemple
pytz.construct("UTC-07:00")
ce qui vous donne le fuseau horaire Canada / Pacifique.