temporizador - time struct_time python
¿Hay una función inversa para time.gmtime() que analiza una tupla UTC en segundos desde la época? (4)
Siempre pensé que los módulos de hora y fecha eran un poco incoherentes. De todos modos, aquí está el inverso de mktime
import time
def mkgmtime(t):
"""Convert UTC tuple to seconds since Epoch"""
return time.mktime(t)-time.timezone
El módulo de tiempo de python parece un poco fortuito. Por ejemplo, aquí hay una lista de métodos, desde la docstring:
time() -- return current time in seconds since the Epoch as a float
clock() -- return CPU time since process start as a float
sleep() -- delay for a number of seconds given as a float
gmtime() -- convert seconds since Epoch to UTC tuple
localtime() -- convert seconds since Epoch to local time tuple
asctime() -- convert time tuple to string
ctime() -- convert time in seconds to string
mktime() -- convert local time tuple to seconds since Epoch
strftime() -- convert time tuple to string according to format specification
strptime() -- parse string to time tuple according to format specification
tzset() -- change the local timezone
Mirando localtime () y su mktime inverso (), ¿por qué no hay inversa para gmtime ()?
Preguntas de bonificación: ¿cómo nombrarías el método? ¿Cómo lo implementarías?
Solo soy un novato en Python, pero este es mi enfoque.
def mkgmtime(fields):
now = int(time.time())
gmt = list(time.gmtime(now))
gmt[8] = time.localtime(now).tm_isdst
disp = now - time.mktime(tuple(gmt))
return disp + time.mktime(fields)
Allí, mi nombre propuesto para la función también. :-) Es importante volver a calcular disp
cada vez, en caso de que cambie el valor de ahorro de luz natural o similar. (La conversión de nuevo a tupla es necesaria para Jython. CPython no parece necesitarla).
Esto es super ick, porque time.gmtime
establece el indicador DST en falso, siempre. Odio el código, sin embargo. Tiene que haber una mejor manera de hacerlo. Y probablemente haya algunos casos de esquina que aún no tengo.
La documentación de mktime es un poco engañosa aquí, no tiene sentido decir que se calcula como hora local, en lugar de calcular los segundos de Epoch de acuerdo con la tupla suministrada, independientemente de la localidad de su computadora.
Si desea hacer una conversión de utc_tuple a la hora local, puede hacer lo siguiente:
>>> time.ctime(time.time())
''Fri Sep 13 12:40:08 2013''
>>> utc_tuple = time.gmtime()
>>> time.ctime(time.mktime(utc_tuple))
''Fri Sep 13 10:40:11 2013''
>>> time.ctime(time.mktime(utc_tuple) - time.timezone)
''Fri Sep 13 12:40:11 2013''
Quizás una pregunta más precisa sería cómo convertir un utc_tuple a local_tuple . Yo lo llamaría gm_tuple_to_local_tuple (prefiero nombres largos y descriptivos):
>>> time.localtime(time.mktime(utc_tuple) - time.timezone)
time.struct_time(tm_year=2013, tm_mon=9, tm_mday=13, tm_hour=12, tm_min=40, tm_sec=11, tm_wday=4, tm_yday=256, tm_isdst=1)
Validación:
>>> time.ctime(time.mktime(time.localtime(time.mktime(utc_tuple) - time.timezone)))
''Fri Sep 13 12:40:11 2013''
Espero que esto ayude, ilia.
En realidad, hay una función inversa, pero por alguna razón extraña, está en el módulo de calendario: calendar.timegm (). Enumeré las funciones en esta respuesta .