python - now - Convierta un unixtime en un objeto datetime y viceversa(par de funciones de conversión de tiempo que son inversas)
python int to datetime (1)
Intento escribir un par de funciones, dt
y ut
, que se convierten entre el tiempo normal de Unix (segundos desde 1970-01-01 00:00:00 UTC) y un objeto datetime de Python.
Si dt
y ut
son inversos adecuados, este código imprimirá la misma marca de tiempo dos veces:
import time, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.fromtimestamp(u)
def ut(d): return time.mktime(d.timetuple())
u = 1004260000
print u, "-->", ut(dt(u))
Por desgracia, la segunda marca de tiempo es 3600 segundos (una hora) menos que la primera. Creo que esto solo ocurre en unixtimes muy particulares, tal vez durante esa hora ese horario de ahorro de saltos de luz. Pero, ¿hay alguna manera de escribir dt
y ut
para que sean verdaderos inversos entre sí?
Pregunta relacionada: Hacer date2num y num2date de matplotlib perfectos inversos
Tiene razón en que este comportamiento está relacionado con el horario de verano. La forma más fácil de evitar esto es asegurarte de que utilizas un huso horario sin horario de verano, UTC tiene más sentido aquí.
datetime.datetime.utcfromtimestamp()
y calendar.timegm()
ocupan de las horas UTC, y son inversas exactas.
import calendar, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.utcfromtimestamp(u)
def ut(d): return calendar.timegm(d.timetuple())
Aquí hay un poco de explicación detrás de por qué datetime.datetime.fromtimestamp()
tiene un problema con el horario de verano, de los documentos:
Devuelva la fecha y hora local correspondiente a la indicación de fecha y hora de POSIX, tal como la devuelve
time.time()
. Si el argumento opcional tz es None o no se especifica, la marca de tiempo se convierte a la fecha y hora local de la plataforma, y el objeto datetime devuelto es ingenuo.
La parte importante aquí es que obtienes un objeto ingenuo datetime.datetime
, lo que significa que no hay información de zona horaria (o horario de verano) como parte del objeto. Esto significa que varias marcas de tiempo diferentes pueden fromtimestamp()
al mismo objeto datetime.datetime
cuando se usa fromtimestamp()
, si elige recoger las horas que caen durante el horario de verano, haga retroceder:
>>> datetime.datetime.fromtimestamp(1004260000)
datetime.datetime(2001, 10, 28, 1, 6, 40)
>>> datetime.datetime.fromtimestamp(1004256400)
datetime.datetime(2001, 10, 28, 1, 6, 40)