Convierta python datetime en epoch con strftime
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).
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'
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
import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple())
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)
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