2010-07-02 9 views

Respuesta

24

gmtime() devolverá la hora UTC y localtime() devolverá la hora local, por lo que al restar los dos debe obtener el desplazamiento utc.

+0

Brilliant! Necesito aprender a pensar simple :) – Paul

+0

Esto es una simplicidad elegante aquí. –

+1

Restarlos da 'TypeError: tipo (s) de operandos no soportados para -: 'time.struct_time' y 'time.struct_time''. ¿Qué es lo que realmente quieres decir? – rakslice

62

time.timezone:

import time 

print -time.timezone 

imprime desplazamiento en segundos (para tener en cuenta el horario de verano (DST) UTC ver time.altzone:

is_dst = time.daylight and time.localtime().tm_isdst > 0 
utc_offset = - (time.altzone if is_dst else time.timezone) 

donde desplazamiento UTC se define a través de: "Para llegar hora local, agregue el desplazamiento utc al tiempo utc. "

En Python 3.3+ hay tm_gmtoff attribute si la biblioteca C subyacente lo admite:

utc_offset = time.localtime().tm_gmtoff 

Nota: time.daylight puede dar un resultado incorrecto en some edge cases.

tm_gmtoff se utiliza automáticamente por fecha y hora, si está disponible en Python 3.3+:

from datetime import datetime, timedelta, timezone 

d = datetime.now(timezone.utc).astimezone() 
utc_offset = d.utcoffset() // timedelta(seconds=1) 

Para obtener el desplazamiento actual de una manera que soluciones alternativas al problema time.daylight y que funciona incluso si no está disponible tm_gmtoff UTC, @jts's suggestion a Substruct la hora local y UTC se puede utilizar:

import time 
from datetime import datetime 

ts = time.time() 
utc_offset = (datetime.fromtimestamp(ts) - 
       datetime.utcfromtimestamp(ts)).total_seconds() 

para obtener UTC compensado por los últimos/fechas futuras, pytz zonas horarias se podrían utilizar:

from datetime import datetime 
from tzlocal import get_localzone # $ pip install tzlocal 

tz = get_localzone() # local timezone 
d = datetime.now(tz) # or some other local date 
utc_offset = d.utcoffset().total_seconds() 

Funciona durante las transiciones de horario de verano, que trabaja para pasado/futuro data incluso si la zona horaria local tenía desplazamiento diferente en el momento, por ejemplo, Europa/Moscú zona horaria en el período de 2010 a 2015 UTC.

+1

Esto es agradable y limpio. – Rockallite

+1

Súper útil. Gracias, J.F. –

+0

Tenga en cuenta que 'total_seconds()' solo está disponible en Python 3.2+. – mattst

2

me gustan:

>>> strftime('%z') 
'-0700' 

me trataron respuesta STC' primero, pero me dio un resultado erróneo. Estoy en -0700 ahora, pero estaba diciendo que estaba en -0800. Pero tuve que hacer una conversión antes de poder obtener algo que pudiera restar, así que tal vez la respuesta fue más incompleta que incorrecta.

+1

''% z'' no es compatible con Python (puede funcionar en algunos sistemas en los que es probable que pueda usar' time.localtime() .tm_gmtoff' en su lugar, para obtener el desplazamiento utc como un número, no como una cadena). El resultado (de ''% z'') debe ser idéntico a la respuesta de @jts'. Incluye tu código si piensas lo contrario. – jfs

+0

importación tiempo tiempo 0 = time.time() utc_time = time.mktime (time.gmtime (tiempo 0)) = LOCAL_TIME time.mktime (time.localtime (tiempo 0)) offset = LOCAL_TIME - utc_time de impresión (offset/(60 * 60)) Da -8. – dstromberg

+0

1. no coloque el código en los comentarios, actualice su respuesta 2. no es correcto usar mktime() aquí, use 'calendar.timegm()' o 'datetime()' para encontrar la diferencia – jfs

-1

Aquí hay un código python3 con solo fecha y hora como importaciones. HTH

>>> from datetime import datetime 
>>> import time 
>>> def date2iso(thedate): 
...  strdate = thedate.strftime("%Y-%m-%dT%H:%M:%S") 
...  minute = (time.localtime().tm_gmtoff/60) % 60 
...  hour = ((time.localtime().tm_gmtoff/60) - minute)/60 
...  utcoffset = "%.2d%.2d" %(hour, minute) 
...  if utcoffset[0] != '-': 
...   utcoffset = '+' + utcoffset 
...  return strdate + utcoffset 
... 
>>> date2iso(datetime.fromtimestamp(time.time())) 
'2015-04-06T23:56:30-0400' 
-3

Esto funciona para mí:

if time.daylight > 0: 
     return time.altzone 
    else: 
     return time.timezone 
+0

es incorrecto. Aviso: ['time.localtime(). Tm_isdst> 0' en un código similar en mi respuesta] (http://stackoverflow.com/a/3168394/4279) – jfs

+0

Lo siento, su publicación es tan larga y completa que lo hago No he entendido que es la misma respuesta. Mi publicación es seguramente una versión más corta de la misma solución. – Alecs

+1

no, el código es incorrecto. 'time.daylight' no dice si el horario de verano es ahora mismo. Dice que la hora local puede tener DST. Es por eso que tienes que llamar a 'time.localtime(). Tm_isdst' – jfs

Cuestiones relacionadas