2010-08-15 8 views
9

In un progetto Python su cui sto lavorando, mi piacerebbe poter ottenere un nome fuso orario "leggibile" dal modulo America/New_York, corrispondente al fuso orario locale del sistema, da visualizzare all'utente . Ogni pezzo di codice che ho visto che accede alle informazioni sul fuso orario restituisce solo uno scostamento numerico (-0400) o un codice lettera (EDT) o qualche volta entrambi. Esiste qualche libreria Python in grado di accedere a queste informazioni o, in caso contrario, convertire il codice offset/lettera in un nome leggibile dall'uomo?Come posso ottenere un nome per il fuso orario leggibile da umani in Python?

Se c'è più di un nome leggibile dall'uomo corrispondente a un determinato fuso orario, una lista dei possibili risultati o uno di essi va bene, e se non c'è un nome leggibile dall'uomo corrispondente al fuso orario corrente, Prenderò un'eccezione o None o [] o qualsiasi altra cosa.

+2

è necessario fare attenzione a come si utilizza questo credo. solo un esempio: quando in Europa/Roma siamo passati da CEST a CET nell'ottobre 2010, sono stati registrati sia '2010-10-31T02: 30: 00CEST' che' 2010-10-31T02: 30: 00CET', uno equivalente a '2010-10-31T00: 30: 00UTC' e l'altro a' 2010-10-31T01: 30: 00UTC'. '2010-10-31T02: 30: 00 Europa/Roma 'sarebbe ambiguo. – mariotomo

risposta

8

http://pytz.sourceforge.net/ può essere di aiuto. Se non altro, potresti essere in grado di prendere un elenco di tutti i fusi orari e poi scorrere fino a trovare quello che corrisponde al tuo offset.

+3

L'iterazione non è una cattiva idea. Li ho ripetuti una volta tutti insieme e ho creato un file 'shelve' o semplicemente memorizzato un' dict' in un modulo o qualcosa di simile al codice della lettera. Quindi puoi semplicemente spedire il 'dict' con l'app e non dover eseguire la ricerca due volte. Non dovresti nemmeno spedire 'pytz' in quel caso: potresti semplicemente usarlo nello script che costruisce il' dict' – aaronasterling

+1

Yep. È qualcosa che funziona bene solo con il pre-calcolo (o anche solo costruendolo all'avvio, non richiede * tanto * se lo fai solo una volta per esecuzione). – Amber

+1

[Il modulo 'tzlocal' può trovare l'oggetto' pytz' tzinfo corrispondente al fuso orario locale] (http://stackoverflow.com/a/35086646/4279) – jfs

1

Partenza python-dateutil

py> from dateutil.tz import * 
py> ny = gettz('America/New York') 
py> ny._filename 
'/usr/share/zoneinfo/America/New_York' 
py> ny._filename.split('/', 4)[-1] 
'America/New_York' 
+0

Ma questo non mi aiuta se ho un oggetto 'tzinfo' che non è stato ottenuto da' dateutil.tz.gettz' - per esempio, uno da 'pytz' - o se ho appena chiamato' gettz() '(in tal caso il nome del file è '/ etc/localtime'). (Ancora apprezzo le informazioni) –

+0

Bene, da dove vengono questi oggetti del fuso orario? È possibile memorizzare il nome del fuso orario - l'argomento della stringa su 'gettz' - e ricostituire i fusi orari utilizzando tale argomento e' gettz'. Suppongo che sto assumendo alcuni casi d'uso, ad esempio la memorizzazione di un tempo e la stringa del fuso orario associata in un database. Non userei mai 'gettz' da solo per ottenere il fuso orario locale, ma anche nel mio caso l'utente sarebbe una persona dietro un browser web. –

9

Di seguito genera una mappatura defaultdict offset di fuso orario (ad esempio '-0400') e abbreviazioni (ad esempio 'EDT') per nomi comuni fuso orario geografiche (ad esempio 'America/New_York') .

import os 
import dateutil.tz as dtz 
import pytz 
import datetime as dt 
import collections 

result=collections.defaultdict(list) 
for name in pytz.common_timezones: 
    timezone=dtz.gettz(name) 
    now=dt.datetime.now(timezone) 
    offset=now.strftime('%z') 
    abbrev=now.strftime('%Z') 
    result[offset].append(name) 
    result[abbrev].append(name)  
print(result) 

Si noti che le abbreviazioni fuso orario possono avere vastly different meanings. Ad esempio, "EST" potrebbe indicare Eastern Summer Time (UTC + 10) in Australia o Eastern Standard Time (UTC-5) in Nord America.

Inoltre, gli scostamenti e le abbreviazioni possono cambiare per le regioni che utilizzano l'ora legale diurna. Pertanto, il salvataggio del comando statico potrebbe non fornire il nome corretto del fuso orario 365 giorni all'anno.

3

Se vuoi letteralmente solo quello che hai chiesto, "il nome del fuso orario del modulo America/New_York, corrispondente al fuso orario locale del sistema", e se ti interessa solo Linux (e simili), allora questo dovrebbe lavoro:

import os 
import os.path 
import sys 

def main(argv): 
    tzname = os.environ.get('TZ') 
    if tzname: 
    print tzname 
    elif os.path.exists('/etc/timezone'): 
    print file('/etc/timezone').read() 
    else: 
    sys.exit(1) 

if __name__ == '__main__': 
    main(sys.argv) 

Naturalmente sarebbe meglio avere una libreria che racchiude questo in un modo più pulito, e che forse gestisce gli altri casi, si fa riferimento nei commenti come già avendo un oggetto tzinfo. Penso che si possa farlo con pytz citato da Amber, ma non è ovvio per me solo come ...

4

Mi piacerebbe essere in grado di ottenere un nome di fuso orario "human-readable" del modulo America/New_York, corrispondente al fuso orario locale del sistema, da visualizzare all'utente.

C'è tzlocal module che restituisce un oggetto pytz tzinfo che corrisponde al sistema di fuso orario locale:

#!/usr/bin/env python 
import tzlocal # $ pip install tzlocal 

print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid) 
# -> Europe/Moscow 

Per rispondere alla domanda nel titolo (per persone provenienti da Google), è possibile utilizzare %Z%z alla stampa il locale informazioni fuso orario:

#!/usr/bin/env python 
import time 

print(time.strftime('%Z%z')) 
# -> MSK+0300 

Esso stampa l'abbreviazione fuso orario corrente e l'offset UTC corrispondente al fuso orario locale.

Problemi correlati