Convierte el datetime de python a la época con strftime

Tengo un tiempo en UTC desde el que quiero el número de segundos desde la época.

Estoy usando strftime para convertirlo en el número de segundos. Tomando como ejemplo el 1 de abril de 2012.

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

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

Así que parece que ese tiempo de actividad está tomando en cuenta la hora de mi sistema y aplica un cambio de zona horaria en alguna parte. Pensé que la fecha era puramente ingenua?

¿Cómo puedo evitar eso? Si es posible, evite importar otras bibliotecas a menos que sea estándar. (Tengo problemas de portabilidad).

Si desea convertir un datetime de python a segundos desde la época, podría hacerlo explícitamente:

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

En Python 3.3+ puedes usar timestamp() lugar:

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

Por qué no debe usar datetime.strftime('%s')

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

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

Tuve problemas serios con las zonas horarias y tal. La forma en que Python maneja todo lo que resulta ser bastante confuso (para mí). Las cosas parecen funcionar bien usando el módulo de calendario (vea los 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, esta única línea funciona:

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

y depende solo de los trabajos de datetime en python2 y python3

Esto funciona en Python 2 y 3:

 >>> import time >>> import calendar >>> calendar.timegm(time.gmtime()) 1504917998 

Simplemente siguiendo los documentos oficiales … https://docs.python.org/2/library/time.html#module-time

Para una solución independiente de la zona horaria explícita, use la biblioteca pytz.

 import datetime import pytz pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp() 

Salida (flotador): 1333238400.0

En Python 3.7

Devuelva un datetime correspondiente a un date_string en uno de los formatos emitidos por date.isoformat () y datetime.isoformat (). Específicamente, esta función admite cadenas en el formato (s) YYYY-MM-DD [* HH [: MM [: SS [.fff [fff]]]] [+ HH: MM [: SS [.ffffff]]]] , donde * puede coincidir con cualquier carácter individual.

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat