Vorrei sapere quali sono tutti i possibili valori per l'argomento timezone nella libreria Python di Python. Come farlo?
ssl.cert_time_to_second()
ASN1_TIME_print()
Vorrei sapere quali sono tutti i possibili valori per l'argomento timezone nella libreria Python di Python. Come farlo?
ssl.cert_time_to_second()
ASN1_TIME_print()
Risposte:
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
'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()
(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.
Non creare il tuo elenco : pytz
ha 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 datetime
oggetto 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
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.
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.
Sembrano essere popolati dai fusi orari del database tz trovati qui .
pytz
fornisce l'accesso al database tz (è la fonte dei dati di Wikipedia).
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 datetime
al suo localize
metodo.
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.
pytz
, lo stai solo usando male. PS Questa non è una risposta alla domanda a tutti .
datetime
interfaccia che non va pytz
. datetime
non ha previsto oggetti del fuso orario intelligenti , quindi la sua interfaccia non li ha inizializzati correttamente.
datetime
fa parte della libreria Python standard ed è Pytz che dovrebbe seguire l' datetime
interfaccia, non viceversa. Se qualcuno potesse implementare un'interfaccia nel modo in cui pensa meglio senza consenso, non ci sarebbe un software robusto.
pytz
non riesco a seguire l' datetime
interfaccia perché l' datetime
interfaccia è 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.
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.