C'è un elenco di fusi orari Pytz?


660

Vorrei sapere quali sono tutti i possibili valori per l'argomento timezone nella libreria Python di Python. Come farlo?


6
È divertente come "GMT", "GMT + 0", "GMT-0", "GMT0", "Greenwich", "UCT", "UTC", "Universal" e "Zulu" significano sostanzialmente la stessa cosa e eppure ci sono così tante voci per questo.
Joe Z.

43
GMT non è uguale a UTC. È un errore comune.
PawelRoman,

1
@PawelRoman: GMT può significare cose diverse in un contesto diverso. Si fa UTC media a volte per esempio, certificato SSL stringhe di tempo, come accettato richiede GMT ( legacy). ssl.cert_time_to_second() ASN1_TIME_print()
jfs il

3
@PawelRoman hai ragione nel senso che uno è un fuso orario e l'altro è uno standard. Ma nel senso pratico che la maggior parte della gente pensa, entrambi si riferiscono allo stesso momento nel tempo.
ruba il

Risposte:


319

Puoi elencare tutti i fusi orari disponibili con pytz.all_timezones:

In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]: 
['Africa/Abidjan',
 'Africa/Accra',
 'Africa/Addis_Ababa',
 ...]

C'è anche pytz.common_timezones:

In [45]: len(pytz.common_timezones)
Out[45]: 403

In [46]: len(pytz.all_timezones)
Out[46]: 563

9
Inoltre all_timezones, fornisce anche pytz common_timezones .
Mark Hildreth,

3
perché manca la Cina?
Aggiunti il

4
La Cina utilizza un unico fuso orario , il cui nome del fuso orario è 'Asia/Shanghai'.
unutbu,

1
Questa espressione mostra il terribile risultato che pytz può dare: (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()(il risultato non è -28800). Eviterò pytz—dateutil.tz fornisce funzionalità simili ma utilizza il database del fuso orario del sistema operativo e non presenta tali problemi.
Yongwei Wu,

2
@YongweiWu è un utilizzo dell'API errato. Non dovresti passare un fuso orario pytz con un offset utc non fisso direttamente come argomento tzinfo. Usa il metodo .localize () come suggeriscono i documenti pytz.
jfs

38

Non creare il tuo elenco : pytzha un set integrato:

import pytz
set(pytz.all_timezones_set)  
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}

È quindi possibile applicare un fuso orario :

import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00

Oppure, se si dispone già di un datetimeoggetto che è TZ conoscenza (non ingenuo):

# 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

27

Il nome del fuso orario è l'unico modo affidabile per specificare il fuso orario.

Puoi trovare un elenco di nomi di fuso orario qui: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Nota che questo elenco contiene molti nomi di alias, come US / Eastern per il fuso orario che viene chiamato correttamente America / New_York.

Se si desidera creare a livello di codice questo elenco dal database zoneinfo, è possibile compilarlo dal file zone.tab nel database zoneinfo. Non penso che pytz abbia un'API per ottenerli, e inoltre non penso che sarebbe molto utile.


14

Qui, elenco Python di codici paese, nomi, continenti, capitali e fusi orari 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'},
]

Per l'elenco completo: Gist Github

Spero che sia d'aiuto.



4

EDIT: Gradirei se non si vota ulteriormente questa risposta. Questa risposta è sbagliata , ma preferirei conservarla come una nota storica. Mentre è discutibile se l'interfaccia pytz è soggetta a errori, può fare cose che dateutil.tz non può fare, specialmente per quanto riguarda l'ora legale in passato o in futuro. Ho onestamente registrato la mia esperienza in un articolo "Fusi orari in Python" .


Se sei su una piattaforma simile a Unix, ti suggerirei di evitare pytz e guardare solo / usr / share / zoneinfo. dateutil.tz può utilizzare le informazioni lì.

Il seguente pezzo di codice mostra il problema che pytz può dare. Sono rimasto scioccato quando l'ho scoperto per la prima volta. (È interessante notare che il pytz installato da yum su CentOS 7 non presenta questo problema.)

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

Vale a dire il fuso orario creato da Pytz è per l'ora locale reale, invece dell'ora locale standard che la gente osserva. Shanghai è conforme a +0800, non +0806 come suggerito da pytz:

pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

EDIT: Grazie al commento e al voto negativo di Mark Ransom, ora so che sto usando pytz nel modo sbagliato. In sintesi, non si deve passare il risultato di pytz.timezone(…)a datetime, ma si deve passare datetimeal suo localizemetodo.

Nonostante le sue argomentazioni (e il mio male per non aver letto più attentamente la documentazione di Pytz), manterrò questa risposta. Stavo rispondendo alla domanda in un modo (come elencare i fusi orari supportati, sebbene non con pytz), perché credevo che pytz non fornisse una soluzione corretta. Sebbene la mia convinzione fosse errata, questa risposta fornisce ancora alcune informazioni, IMHO, che è potenzialmente utile per le persone interessate a questa domanda. Il modo corretto di fare le cose di Pytz è controintuitivo. Diamine, se il tzinfo creato da Pytz non deve essere utilizzato direttamente da datetime, dovrebbe essere di un tipo diverso. L'interfaccia pytz è semplicemente mal progettata. Il collegamento fornito da Mark mostra che molte persone, non solo me, sono state fuorviate dall'interfaccia pytz.


2
Vedi stackoverflow.com/questions/11473721/… per una correzione. Non c'è niente di sbagliato in pytz, lo stai solo usando male. PS Questa non è una risposta alla domanda a tutti .
Mark Ransom,

1
@MarkRansom Buone informazioni ed è bello saperlo. Tuttavia, non compro il tuo argomento. L'interfaccia è stata progettata in modo errato, punto. È molto controintuitivo.
Yongwei Wu,

3
Sì, l'interfaccia è stata progettata in modo errato. Ma è l' datetimeinterfaccia che non va pytz. datetimenon ha previsto oggetti del fuso orario intelligenti , quindi la sua interfaccia non li ha inizializzati correttamente.
Mark Ransom,

1
Con rispetto, non sono d'accordo. datetimefa parte della libreria Python standard ed è Pytz che dovrebbe seguire l' datetimeinterfaccia, non viceversa. Se qualcuno potesse implementare un'interfaccia nel modo in cui pensa meglio senza consenso, non ci sarebbe un software robusto.
Yongwei Wu,

2
Come ho detto, pytznon riesco a seguire l' datetimeinterfaccia perché l' datetimeinterfaccia è carente. Gli autori di tale interfaccia non hanno anticipato i problemi di un fuso orario i cui parametri cambiano nel corso degli anni. Solo perché fa parte della distribuzione standard di Python non significa che sia perfetto.
Mark Ransom,

-8

Secondo me questo è un difetto di progettazione della libreria pytz. Dovrebbe essere più affidabile specificare un fuso orario usando l'offset, ad es

pytz.construct("UTC-07:00")

che ti dà il fuso orario Canada / Pacifico.


12
Gli offset cambiano durante l'anno (di solito a causa dell'ora legale), quindi non è la stessa cosa che normalmente pensiamo come fuso orario.
Ryan Hiebert,

La sintassi scelta si basa sulle definizioni in tzdata .
Brad Koch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.