Tengo que crear un valor "Expira" 5 minutos en el futuro, pero tengo que proporcionarlo en formato UNIX Timestamp. Tengo esto hasta ahora, pero parece un truco.
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
epoch = datetime.datetime(1970, 1, 1)
seconds_in_a_day = 60 * 60 * 24
five_minutes = datetime.timedelta(seconds=5*60)
five_minutes_from_now = datetime.datetime.now() + five_minutes
since_epoch = five_minutes_from_now - epoch
return since_epoch.days * seconds_in_a_day + since_epoch.seconds
¿Hay algún módulo o función que realice la conversión de marca de tiempo para mí?
python
datetime
unix-timestamp
Daniel Rhoden
fuente
fuente
Respuestas:
Otra forma es usar
calendar.timegm
:También es más portátil que
%s
flag tostrftime
(que no funciona en Windows).fuente
calendar.timegm(future.utctimetuple())
. Esto asegura que se pasa una hora UTCcalendar.timegm
.21600.0
segundos (6 horas) en lugar de 0.0 para el TZ de mi máquina Unixcalendar.timegm(datetime.datetime.utcnow().timetuple())
. El método de usodatetime.datetime.now().utctimetuple()
no funciona para mí (Python 3.2).Ahora en Python> = 3.3 puede llamar al método timestamp () para obtener la marca de tiempo como flotante.
fuente
datetime.now()
) es malo porque alienta el uso de objetos ingenuos de fecha y hora que representan la hora local y puede fallar durante las transiciones DST (debido a la ambigüedad inherente). Podrías usarts = datetime.now(timezone.utc).timestamp()
en su lugar.utcnow()
. Estoy acostumbrado a trabajar en máquinas donde la zona horaria está configurada en UTC, pero eso no debería suponerse en este fragmento de código.Acabo de encontrar esto, y es aún más corto.
fuente
time.time()
se puede retroceder. Para crear un valor de "Caduca" 5 minutos en el futuro, es posible que necesite untime.monotonic()
análogo dependiendo de su caso de uso.monotonic
se puede usar depende de su caso de uso, por ejemplo, elsubprocess
módulo lo usa para implementar latimeout
opción.Esto es lo que necesitas:
fuente
mktime(dt.timetuple())
.datetime.now(timezone.utc).timestamp()
proporcionado por @Tim Tisdall es la solución en Python 3.3+. De(dt - epoch).total_seconds()
lo contrario podría ser utilizado .Puede usar
datetime.strftime
para obtener el tiempo en forma de Época, usando la%s
cadena de formato:Nota: Esto solo funciona en Linux, y este método no funciona con zonas horarias.
fuente
ValueError: Invalid format string
).Aquí hay una
datetime
solución de base menos rota para convertir de un objeto de fecha y hora a una marca de tiempo posix:Ver más detalles en Convertir datetime.date a marca de tiempo UTC en Python .
fuente
fuente
La clave es asegurarse de que todas las fechas que está utilizando estén en la zona horaria utc antes de comenzar a convertir. Consulte http://pytz.sourceforge.net/ para saber cómo hacerlo correctamente. Al normalizar a utc, elimina la ambigüedad de las transiciones de horario de verano. Luego puede usar timedelta de manera segura para calcular la distancia desde la época de Unix y luego convertirlo a segundos o milisegundos.
Tenga en cuenta que la marca de tiempo de Unix resultante se encuentra en la zona horaria UTC. Si desea ver la marca de tiempo en una zona horaria localizada, deberá realizar otra conversión.
También tenga en cuenta que esto solo funcionará para fechas posteriores a 1970.
fuente
1970-01-01 00:00:00+00:00
). Para obtener un objeto de fecha y hora ingenuo en la zona horaria local:datetime.fromtimestamp(ts)
Lo siguiente se basa en las respuestas anteriores (más una corrección para los milisegundos) y emula
datetime.timestamp()
para Python 3 antes de 3.3 cuando se usan zonas horarias.Para responder estrictamente a la pregunta que se le preguntó, querría:
datetime_timestamp
es parte de fecha simple . Pero si estuviera usando ese paquete, probablemente escribiría:que maneja muchos más formatos / tipos para my_datetime.
fuente
fuente
Tenga en cuenta que las soluciones con
timedelta.total_seconds()
trabajo en python-2.7 +. Usarcalendar.timegm(future.utctimetuple())
para versiones inferiores de Python.fuente