Obtención del offset UTC de la computadora en Python

En Python, ¿cómo encuentra la diferencia de tiempo UTC con la que está configurada la computadora?

gmtime() devolverá la hora UTC y localtime() devolverá la hora local, por lo que al restar los dos se le otorgará la compensación de utc.

time.timezone :

 import time print -time.timezone 

Imprime el desplazamiento UTC en segundos (para tener en cuenta el horario de verano, vea time.altzone :

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

donde se define el desplazamiento utc a través de: “Para obtener la hora local, agregue el desplazamiento utc a la hora utc”.

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

 utc_offset = time.localtime().tm_gmtoff 

Nota: time.daylight puede dar un resultado incorrecto en algunos casos de borde .

tm_gmtoff se usa automáticamente por datetime 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 desfase UTC actual de forma que solucione el problema de time.daylight y que funcione incluso si tm_gmtoff no está disponible, se puede usar la sugerencia de @ jts para substruir la hora local y UTC:

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

Para obtener la compensación UTC para las fechas pasadas / futuras, las pytz horarias de pytz podrían utilizarse:

 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, funciona para fechas pasadas / futuras, incluso si la zona horaria local tenía un desplazamiento UTC diferente en el momento, por ejemplo, la zona horaria Europa / Moscú en el período 2010-2015.

Me gusta:

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

Primero intenté la respuesta de JTS, pero me dio el resultado equivocado. Estoy en -0700 ahora, pero estaba diciendo que estaba en -0800. Pero tuve que hacer algunas conversiones antes de poder obtener algo que pudiera restar, así que tal vez la respuesta fue más incompleta que incorrecta.

 hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60 

Crear una marca de tiempo Unix con UTC Zona horaria corregida

Esta función simple le facilitará obtener la hora actual desde un objeto de date base de datos MySQL / PostgreSQL.

 def timestamp(date='2018-05-01'): return int(time.mktime( datetime.datetime.strptime( date, "%Y-%m-%d" ).timetuple() )) + int(time.strftime('%z')) * 6 * 6 

Ejemplo de salida

 >>> timestamp('2018-05-01') 1525132800 >>> timestamp('2018-06-01') 1527811200 

Aquí hay algo de código de python3 con 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' 

Esto funciona para mí:

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