Tengo un tiempo en UTC a partir del cual quiero la cantidad de segundos desde la época.
Estoy usando strftime para convertirlo a la cantidad de segundos. Tomando el 1 de abril de 2012 como ejemplo.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
El 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 ese tiempo de espera está tomando en cuenta el tiempo de mi sistema y aplica un cambio de zona horaria en algún lugar. ¿Pensé que la fecha y hora 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).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Respuestas:
Si desea convertir una fecha y hora de Python a segundos desde época, puede hacerlo explícitamente:
En Python 3.3+ puedes usar
timestamp()
en su lugar:Por qué no deberías usar
datetime.strftime('%s')
Python en realidad no admite% s como argumento para strftime (si marca 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 está pasando la información al tiempo de ejecución de su sistema, que utiliza su zona horaria local.
fuente
.strftime("%s")
: no es compatible, no es portátil, puede producir silenciosamente un resultado incorrecto para un objeto de fecha y hora consciente, falla si la entrada está en UTC (como en la pregunta) pero la zona horaria local no es UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Esto descarta la parte de microsegundos.Tuve serios problemas con Timezones y demás. La forma en que Python maneja todo lo que resulta ser bastante confuso (para mí). Las cosas parecen estar funcionando bien usando el módulo de calendario (ver enlaces 1 , 2 , 3 y 4 ).
fuente
aprilFirst
en este ejemplo fuera una instancia 'consciente' y utilizara una zona horaria diferente de la zona horaria del sistema, el resultado no sería correcto (la zona horaria se pierde en latimetuple()
llamada). Para obtener la respuesta correcta para una fecha y hora "consciente", puede usarlaawaredt.timestamp()
en Python 3. reciente. Para Python 2 es más difícil; Una forma es utilizar laarrow
biblioteca.arrow.get(awaredt).timestamp
Lo hará bien.datetime
objeto, así que supuse que "Tengo un tiempo en UTC" significaba que el OP tenía undatetime
objeto desconocido que se suponía que estaba en UTC para lo que quería para obtener unepoch
(sidatetime
resulta ser consciente de TZ esto podría, de hecho, cambiar las cosas). Además, tenga en cuenta que esta respuesta tiene casi 8 años y han sucedido muchas cosas desde entonces (arrow
fue lanzado en 2013, por ejemplo)fuente
time.time()
(mktime()
puede fallar durante las transiciones DST mientrastime.time()
continúa funcionando). Y no responde la pregunta a menos que la zona horaria local sea UTC (la entrada en la pregunta está en UTC). Incluso si la entrada representara una hora local, entoncesmktime()
también puede fallar para fechas pasadas / futuras si no usa la base de datos tz y si la zona horaria local puede tener diferentes compensaciones de utc a lo largo de los años, por ejemplo, Europa / Moscú en 2010-2015 - - use la hora UTC (como en la pregunta) u objetos datetime con reconocimiento de zona horaria en su lugar..now()
) a la marca de tiempo de época (devuelta pormktime()
) . Si lo lees; a entender por qué la entrada UTC (utilizado en la pregunta) es (mucho) más preferible que un objeto de fecha y hora ingenua que representa la hora local(Lo siento, no me dejaba comentar sobre la respuesta existente)
fuente
Si solo necesita una marca de tiempo en tiempo unix / epoch, esta línea funciona:
y depende solo de
datetime
trabajos en python2 y python3fuente
Esto funciona en Python 2 y 3:
Simplemente siguiendo los documentos oficiales ... https://docs.python.org/2/library/time.html#module-time
fuente
Para una solución explícita independiente de la zona horaria, use la biblioteca pytz.
Salida (flotante): 1333238400.0
fuente
En Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
fuente