2009-07-10 2 views

risposta

10

Controlla il modulo Python Time.

from time import gmtime, strftime 
print strftime("%z", gmtime()) 

Pacific Standard Tempo

+0

stiamo guardando diversi documenti o è ''% Z''? – SilentGhost

+0

@ SilentGhost: "% z" e "% z" sono esattamente gli stessi in Python. – ahawker

+11

sì, ma ** maiuscolo ** 'Z' e ** minuscolo **' z' no. – SilentGhost

60

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.

+19

Per continuare, è possibile utilizzare 'time.tzname [time.daylight]' per ottenere il nome del fuso orario corrente, tenendo conto dell'ora legale. –

+9

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

+0

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

4

Se si preferisce offset UTC su stringhe:

time.timezone/-(60*60) 
+4

Questo calcola erroneamente quando (/ se) è in vigore l'ora legale. – marr75

20

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.

+1

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

+1

[tutta l'altzone, la soluzione basata sul fuso orario potrebbe non funzionare in alcuni casi marginali] (http://bugs.python.org/issue1647654) – jfs

11

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.

+0

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