Convierta python datetime en epoch con strftime

Resuelto Noel asked hace 12 años • 8 respuestas

Tengo una hora en UTC de la que quiero la cantidad de segundos desde la época.

Estoy usando strftime para convertirlo a la cantidad de segundos. Tomando como ejemplo el 1 de abril de 2012.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

1 de abril de 2012 UTC de la época es 1333238400, pero lo anterior devuelve 1333234800, que es diferente en 1 hora.

Entonces parece que strftime está tomando en cuenta la hora de mi sistema y aplica un cambio de zona horaria en alguna parte. ¿Pensé que la cita era puramente ingenua?

¿Cómo puedo solucionar eso? Si es posible, evite importar otras bibliotecas a menos que sean estándar. (Tengo dudas sobre la portabilidad).

Noel avatar Jul 31 '12 21:07 Noel
Aceptado

En Python 3.3+ puedes usar timestamp():

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

En Python 3.2 o anterior, puedes hacerlo explícitamente:

 >>> (datetime.datetime(2012,4,1,0,0) - datetime.datetime(1970,1,1)).total_seconds()
 1333238400.0

Por qué no deberías usardatetime.strftime('%s')

Python en realidad no admite %s como argumento para strftime (si consulta http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior no está en la lista), el único La razón por la que funciona es porque Python pasa la información al strftime de su sistema, que utiliza su zona horaria local.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
jleahy avatar Jul 31 '2012 15:07 jleahy

Tuve serios problemas con las zonas horarias y demás. La forma en que Python maneja todo esto resulta bastante confusa (para mí). Todo parece funcionar bien con el módulo de calendario (ver enlaces 1 , 2 , 3 y 4 ).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
Savir avatar Jul 31 '2012 15:07 Savir
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
srossross avatar Jun 20 '2013 01:06 srossross
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(Lo siento, no me deja comentar sobre la respuesta existente)

Charles Plager avatar Sep 23 '2013 19:09 Charles Plager

Si solo necesita una marca de tiempo en Unix/epoch time, esta línea funciona:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

y depende solo de datetime trabajos en python2 y python3

Marc Maxmeister avatar Apr 05 '2018 19:04 Marc Maxmeister