Voglio ottenere il fuso orario predefinito (PST) del mio sistema da Python. Qual è il modo migliore per farlo? Mi piacerebbe evitare di biforcare un altro processo.Ottieni informazioni sul fuso orario del sistema in Python?
risposta
Controlla il modulo Python Time.
from time import gmtime, strftime
print strftime("%z", gmtime())
Pacific Standard Tempo
che dovrebbe funzionare:
import time
time.tzname
che restituisce una tupla di due stringhe: la prima è il nome del fuso orario non-DST locale, il secondo è il nome del fuso orario dell'ora legale locale.
Per continuare, è possibile utilizzare 'time.tzname [time.daylight]' per ottenere il nome del fuso orario corrente, tenendo conto dell'ora legale. –
Anche in questo caso, "time.daylight" non indica che l'ora legale è attiva. Indica semplicemente se il DST viene osservato o meno dal fuso orario. Stai cercando 'time.localtime(). Tm_isdst'. – marr75
Solo per aggiungere utenti Windows, i valori per fuso orario sono stati definiti in 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fusi orari \ ' – swdev
Se si preferisce offset UTC su stringhe:
time.timezone/-(60*60)
Questo calcola erroneamente quando (/ se) è in vigore l'ora legale. – marr75
Dà un offset come nella risposta di ThomasH UTC, ma prende legale in considerazione.
>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset/60/60 * -1
-9
Il valore di time.timezone
o time.altzone
è espresso in secondi a ovest di UTC (con le zone orientali di UTC ottenere un valore negativo). Questo è l'opposto di come ci piacerebbe davvero, da qui il * -1.
time.localtime().tm_isdst
sarà zero se l'ora legale non è attualmente in vigore (anche se questo potrebbe non essere corretto se una zona ha recentemente cambiato la legge legale).
MODIFICA: marr75 è corretto, ho modificato la risposta di conseguenza.
Per sicurezza, penso che il controllo offset debba essere invertito (altzone if dst = 1 altro fuso orario). Se lo stato dell'ora legale è in qualche modo sconosciuto, 'tm_isdst' sarà' -1', e in questo caso il codice corrente sarà predefinito in 'altzone'. Per le regioni che non utilizzano l'ora legale, questo valore non è mai corretto, quindi 'timezone' dovrebbe probabilmente essere il fallback. (Non sono sicuro che '-1 'sia effettivamente possibile l'output da' localtime')) – nmclean
[tutta l'altzone, la soluzione basata sul fuso orario potrebbe non funzionare in alcuni casi marginali] (http://bugs.python.org/issue1647654) – jfs
I frammenti di codice per il calcolo dell'offset non sono corretti, vedere http://bugs.python.org/issue7229.
Il modo corretto per gestire questa situazione è:
def local_time_offset(t=None):
"""Return offset of local zone from GMT, either at present or at time t."""
# python2.3 localtime() can't take None
if t is None:
t = time.time()
if time.localtime(t).tm_isdst and time.daylight:
return -time.altzone
else:
return -time.timezone
Questo è con ogni probabilità, non la domanda esatta che il PO ha chiesto, ma ci sono due frammenti non corrette nella pagina web e di tempo bug succhiare da rintracciare e aggiustare.
1. se si conosce 'tm_isdst'; non è necessario controllare 'daylight' 2. [all' altzone', la soluzione basata su" timezone' potrebbe non funzionare in alcuni casi limite] (http://bugs.python.org/issue1647654) – jfs
stiamo guardando diversi documenti o è ''% Z''? – SilentGhost
@ SilentGhost: "% z" e "% z" sono esattamente gli stessi in Python. – ahawker
sì, ma ** maiuscolo ** 'Z' e ** minuscolo **' z' no. – SilentGhost