No Python, como você converte segundos desde a época em um objeto `datetime`?

248

O timemódulo pode ser inicializado usando segundos desde a é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)

Existe uma maneira elegante de inicializar um datetime.datetimeobjeto da mesma maneira?

Adam Matan
fonte
3
para a operação oposta, clique aqui: converter um objeto de data e hora em segundos #
Trevor Boyd Smith

Respostas:

404

datetime.datetime.fromtimestamp Se você souber o fuso horário, poderá produzir a mesma saída que com time.gmtime

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

ou

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)
SilentGhost
fonte
42
estranhamente, datetime.utcfromtimestampcria um registro de data e hora ingênuo. Eu precisei import pytze usei datetime.fromtimestamp(1423524051, pytz.utc)para criar um datetime consciente.
Matt
6
como um follow-on com o acima exposto, com o Python> = 3,2 você não tem que importar a pytzbiblioteca se você quiser apenas o timestamp UTC - você só precisa from datetime import datetime, timezonee, em seguida, chamá-lo da seguinte forma: datetime.fromtimestamp(1423524051, timezone.utc). Ele salvou a biblioteca extra muitas vezes quando eu só preciso do fuso horário UTC pytz.
precisa saber é
38

Segundos desde a época datetimepara 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
fonte
Deve ser datetime.fromtimestamp (1579366345) .strftime ('% Y-% m-% d% H:% M:% S')
vml19 de
26

A partir dos documentos, a maneira recomendada de obter um objeto de data e hora com reconhecimento de fuso horário de segundos desde a época é:

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
fonte
Um link para a documentação em suas legendas ("Python 3", "Python 2") seria útil - e eu também recomendo alterar a ordem deles.
Adam Matan
Atualizada. Deixando a ordem da mesma forma, pois isso corresponde aos documentos do Python.
Meistro
você não precisa pytzapenas obter o utcobjeto tzinfo. É fácil criá-lo você mesmo
jfs
9

Observe que datetime.datetime. fromtimestamp (timestamp) e. utcfromtimestamp (timestamp) falha no Windows em datas anteriores a 1º de janeiro de 1970, enquanto os timestamps negativos para unix parecem funcionar em plataformas baseadas em unix. Os documentos dizem o seguinte:

" Isso pode aumentar o ValueError, se o registro de data e hora estiver fora do intervalo de valores suportados pela função da plataforma C gmtime (). É comum que isso seja restrito a anos de 1970 a 2038 "

Veja também a edição1646728

cbare
fonte
: o) sim, ainda há 23 anos para que seja corrigido #
user3666197 15/15/15
5
você pode usar utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp), para contornar isso.
JFS