En Python, ¿cómo convierte segundos desde la época en un objeto `datetime`?

248

El timemódulo se puede inicializar usando segundos desde la época:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

¿Hay una manera elegante de inicializar un datetime.datetimeobjeto de la misma manera?

Adam Matan
fuente
3
para la operación opuesta, vaya aquí: convert-a-datetime-object-to-segundos
Trevor Boyd Smith

Respuestas:

404

datetime.datetime.fromtimestamp servirá, si conoce la zona horaria, podría producir la misma salida que con time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

o

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)
SilentGhost
fuente
42
extrañamente, datetime.utcfromtimestampcrea una marca de tiempo ingenua. Tuve que import pytzusar datetime.fromtimestamp(1423524051, pytz.utc)y crear una fecha y hora consciente.
Matt
66
como una continuación de lo anterior, con Python> = 3.2 usted no tiene que importar la pytzbiblioteca si solo deseas la marca de hora UTC - sólo es necesario from datetime import datetime, timezoney luego llama de la siguiente manera: datetime.fromtimestamp(1423524051, timezone.utc). Ha guardado la biblioteca extra muchas veces cuando solo necesito la zona horaria UTC pytz.
phouse512
38

Segundos desde la época datetimehasta strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'
Seganku
fuente
Debe ser datetime.fromtimestamp (1579366345) .strftime ('% Y-% m-% d% H:% M:% S')
vml19
26

De los documentos, la forma recomendada de obtener un objeto de fecha y hora consciente de la zona horaria desde segundos desde la época es:

Python 3 :

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2 , usando pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)
Meistro
fuente
Sería útil un enlace a la documentación en sus subtítulos ("Python 3", "Python 2"), y también recomiendo cambiar su orden.
Adam Matan
Actualizado. Dejando el orden igual, ya que coincide con los documentos de Python.
Meistro
no pytzsolo necesita obtener el utcobjeto tzinfo. Es fácil crearlo usted mismo
jfs
9

Tenga en cuenta que datetime.datetime. fromtimestamp (marca de tiempo) y. utcfromtimestamp (marca de tiempo) falla en Windows para fechas anteriores al 1 de enero de 1970, mientras que las marcas de tiempo negativas de Unix parecen funcionar en plataformas basadas en Unix. Los documentos dicen esto:

" Esto puede aumentar ValueError, si la marca de tiempo está fuera del rango de valores admitidos por la función C gmtime () de la plataforma. Es común que esto se restrinja a años en 1970 hasta 2038 "

Ver también Issue1646728

cbare
fuente
: o) sí, todavía quedan unos 23 años para dejar que se arregle
user3666197
55
podría usarlo utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp)para solucionarlo.
jfs