biblioteca - Convierta python datetime en época con strftime
set datetime python (6)
Tengo un tiempo en UTC del cual quiero el número de segundos desde la época.
Estoy usando strftime para convertirlo a la cantidad de segundos. Tomando el 1 de abril de 2012 como un ejemplo.
>>>datetime.datetime(2012,04,01,0,0).strftime(''%s'')
''1333234800''
El 1 de abril de 2012, UTC from epoch es 1333238400, pero esta cifra anterior devuelve 1333234800, que es diferente en 1 hora.
Así que parece que strftime está teniendo en cuenta el tiempo de mi sistema y aplica un cambio de zona horaria en alguna parte. Pensé que la hora era puramente ingenua?
¿Cómo puedo evitar eso? Si es posible evite importar otras bibliotecas a menos que sean estándar. (Tengo preocupaciones de portabilidad).
Esto funciona en Python 2 y 3:
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998
Solo siguiendo los documentos oficiales ... https://docs.python.org/2/library/time.html#module-time
Python en realidad no admite% s como argumento para strftime (si lo marca en http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior , no está en la lista), el único La razón por la que está funcionando es porque Python está pasando la información al tiempo de servicio de su sistema, que usa su zona horaria local.
Si desea convertir una fecha y hora de python en segundos desde epoch, debe hacerlo explícitamente:
>>> datetime.datetime(2012,04,01,0,0).strftime(''%s'')
''1333234800''
>>> (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
Tuve problemas serios con Timezones y tal. La forma en que Python maneja todo lo que sucede es bastante confuso (para mí). Las cosas parecen funcionar bien usando 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
si solo necesitas una marca de tiempo en el tiempo de Unix / época, esta línea funciona:
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
y solo depende de los trabajos de fecha y datetime
en python2 y python3
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)
import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple())