¿Cómo obtener los segundos desde la época de la salida de hora + fecha de gmtime ()?

162

¿Cómo retrocede gmtime(), donde pone la hora + fecha y obtiene el número de segundos?

Tengo cadenas como 'Jul 9, 2009 @ 20:02:58 UTC', y quiero recuperar el número de segundos entre la época y el 9 de julio de 2009.

Lo he intentado time.strftimepero no sé cómo usarlo correctamente, o si es el comando correcto.

calccrypto
fuente

Respuestas:

123

Si llegó aquí porque un motor de búsqueda le dijo que así es como obtener la marca de tiempo de Unix, deje de leer esta respuesta. Desplácese hacia abajo uno.

Si quieres revertir time.gmtime(), quieres calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Puede convertir su cadena en una tupla de tiempo con time.strptime(), que devuelve una tupla de tiempo que puede pasar a calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Más información sobre el módulo de calendario aquí.

nmichaels
fuente
16
Si está buscando el tiempo de época actual de Unix, consulte el comentario de @ DanJ o la respuesta de Naren, ¡esta respuesta es incorrecta!
kosii
641

Use el módulo de tiempo :

epoch_time = int(time.time())
naren
fuente
14
@DanJ: es el número de segundos transcurridos desde Epoch (un momento fijo en el tiempo) y es el mismo en cualquier zona horaria. Aunque si ignoramos las instancias de tiempo alrededor de los segundos bisiestos; es fácil convertirlo a UTC si timeusa Unix epoch (1970).
jfs
43
Tenga en cuenta que esto no es lo que pedía el OP, pero es lo que quería. Entonces +1.
fearless_fool
66
es la respuesta a lo que se pide en el título: "obtener el tiempo desde la época". +1
AlejandroVD
@JFSebastian esto le da época a segundos. ¿Cómo puedo obtener la resolución hasta milisegundos usando la misma respuesta anterior?
Marlon Abeykoon
2
para extender mi comentario anterior : el time.time()valor NO depende de la zona horaria local (si excluimos las zonas horarias "correctas" y similares), por ejemplo, si devuelve el tiempo POSIX (como lo hace en la mayoría de los sistemas), entonces es el número de segundos SI desde La Época (1970-01-01UTC) sin contar los segundos bisiestos. Este valor se puede convertir a UTC (excluyendo los segundos bisiestos) pero no es UTC . @MarlonAbeykoon: Me gusta esta respuesta
jfs
10

Tenga en cuenta que time.gmtimeasigna la marca 0de tiempo a 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) le proporciona una marca de tiempo desplazada por una cantidad que depende de su ubicación, que en general puede no ser 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

El inverso de time.gmtimees calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0
unutbu
fuente
Esto da una mejor explicación y ejemplo a time.mktime (que tiene en cuenta la zona horaria actual), gracias
Jkm
@Jkm: NO lo use mktime()con gmtime(). mktime()acepta su hora local pero gmtime()devuelve la hora UTC : su zona horaria local puede y es probable que sea diferente. la "marca de tiempo relativa a su localidad" no tiene sentido: la marca de tiempo POSIX no depende de su localidad (zona horaria local); es el mismo valor en todo el mundo. "segundos desde la época" es la marca de tiempo POSIX en la mayoría de los casos (incluso en Windows); cosas como las zonas horarias "correctas" que usan la escala de tiempo TAI no son comunes. Consulte ¿Devuelve time.time () de Python la marca de tiempo local o UTC?
jfs
@JF Sebastian Tienes razón. En realidad, tuve algunos problemas mktime()recientemente. Para algunos servidores web de Python (Tornado, por ejemplo), dado que el proceso sigue ejecutándose, incluso si cambio la configuración regional del sistema, la mktime()llamada por la API del servidor web todavía usa la zona horaria anterior para generar el objeto de tiempo. Tengo que cambiar gmtime()y aplicar manualmente el desplazamiento gmt.
Jkm
5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Esto debería ser diferente de int(time.time()), pero es seguro usar algo comox % (60*60*24)

datetime - Tipos básicos de fecha y hora:

A diferencia del módulo de tiempo, el módulo de fecha y hora no admite segundos bisiestos.

usuario3226167
fuente
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
fuente
No puedo acceder a strptime por alguna razón. He importado datetime
calccrypto
1
@calccrypto que tiene que sea from datetime import datetimeo hacesdatetime.datetime.strptime
pathikrit