2010-09-12 19 views
164

El módulo time se puede inicializar usando segundos desde la época:inicializar un objeto de fecha y hora con 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 para inicializar un objeto datetime.datetime de la misma manera?

Respuesta

269

datetime.datetime.fromtimestamp va a hacer, si conoce la zona horaria, se puede producir el mismo resultado 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) 
+28

extrañamente, 'datetime.utcfromtimestamp' crea una marca de tiempo ingenuo. Tuve que 'importar pytz' y usar' datetime.fromtimestamp (1423524051, pytz.utc) 'para crear una fecha de atención. – Matt

+0

como un seguimiento de lo anterior, con Python> = 3.2 no tiene que importar la biblioteca 'pytz' si solo desea la indicación de fecha y hora UTC; solo necesita' from datetime import datetime, timezone' y luego llamar de la siguiente manera: 'datetime.fromtimestamp (1423524051, timezone.utc)'. Ha guardado la biblioteca adicional muchas veces cuando solo necesito la zona horaria UTC de 'pytz'. – phouse512

22

segundos desde el periodo de datetime a strftime:

>>> ts_epoch = 1362301382 
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S') 
>>> ts 
'2013-03-03 01:03:02' 
6

Tenga en cuenta que d atetime.datetime. fromtimestamp (marca de tiempo) y. utcfromtimestamp (timestamp) fallan 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:

"This may raise ValueError, if the timestamp is out of the range of values supported by the platform C gmtime() function. It’s common for this to be restricted to years in 1970 through 2038"

Véase también Issue1646728

+0

: o) sí, todavía quedan unos 23 años para que se solucione – user3666197

+2

puede usar 'utc_time = datetime (1970,1,1) + timedelta (seconds = timestamp)', para solucionarlo. – jfs

10

A partir de los documentos, la forma recomendada de conseguir una cuenta objeto de fecha y hora zona horaria en segundos desde época es:

Python 3:

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

Python 2, utilizando pytz:

from datetime import datetime 
import pytz 
datetime.fromtimestamp(timestamp, pytz.utc) 
+0

Un enlace a la documentación en sus subtítulos ("Python 3", "Python 2") sería útil, y también recomiendo cambiar su orden. –

+0

Actualizado. Dejando el orden de la misma, ya que coincide con los documentos de Python. – Meistro

+0

no necesita 'pytz' solo para obtener el objeto' utc' tzinfo. [Es fácil crearlo tú mismo] (http://stackoverflow.com/a/2331635/4279) – jfs

Cuestiones relacionadas