Como você converte um time.struct_time
objeto Python em um datetime.datetime
objeto?
Eu tenho uma biblioteca que fornece a primeira e uma segunda biblioteca que deseja a segunda.
Use time.mktime () para converter a tupla de tempo (no horário local) em segundos desde a época, depois use datetime.fromtimestamp () para obter o objeto datetime.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
dados? Eu acho que sim, o que resulta datetime objeto permanece ingênuo a ponto de voltarNone
no.dst()
mesmo sestruct.tm_isdst
é1
.mktime()
deve ser levadotm_isdst
em consideração e Pythontime.mktime()
chama amktime()
função C no CPython.mktime()
pode escolher a hora local errada quando for ambígua (por exemplo, durante a transição de final de horário de verão ("fall back")) sestruct.tm_isdst
estiver-1
ou semktime()
na plataforma fornecida ignorar a entradatm_isdst
. Além disso, se o fuso horário local tiver um deslocamento utc diferente no passado e Cmktime()
não usar um banco de dados tz histórico que possa fornecer os valores antigos de deslocamento utc, tambémmktime()
poderá retornar um valor errado (por exemplo, por uma hora).mktime()
não ignorartm_isdst
na plataforma especificada (na minha),fromtimestamp()
definitivamente perde a informação: o objeto ingênuo retornado quedatetime
representa a hora local pode ser ambíguo (timestamp -> hora local é determinístico (se ignorarmos os segundos bissextos), maslocal time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp () `pode escolher uma compensação se o ele não usa um banco de dados tz histórico UTC errado.Como isso:
fonte
*
e**
sintaxe permite expandir um objeto do tipo listy ou dicty para separar argumentos - é uma das minhas peças favoritas de adorável Python. Veja docs.python.org/2/tutorial/… para obter mais informaçõest=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
datetime
:datetime(*t[:5]+(min(t[5], 59),))
por exemplo, para aceitar"2015-06-30 16:59:60 PDT"
.Esta não é uma resposta direta à sua pergunta (que já foi respondida muito bem). No entanto, depois de várias vezes me morder no fundamento várias vezes, não posso enfatizar o suficiente para que você olhe atentamente o que seu objeto time.struct_time está fornecendo, em comparação com o que outros campos de tempo podem ter.
Supondo que você tenha um objeto time.struct_time e outra string de data / hora, compare os dois e verifique se você não está perdendo dados e criando inadvertidamente um objeto ingetime datetime, quando é possível fazê-lo.
Por exemplo, o excelente módulo feedparser retornará um campo "publicado" e poderá retornar um objeto time.struct_time em seu campo "Published_parsed":
Agora observe o que você realmente recebe com o campo "publicado".
Pela barba de Stallman ! Informações sobre fuso horário!
Nesse caso, o homem preguiçoso pode querer usar o excelente módulo dateutil para manter as informações do fuso horário:
o que nos dá:
Pode-se então usar o objeto datetime com reconhecimento de fuso horário para normalizar o tempo todo para UTC ou o que você achar incrível.
fonte
*_parsed
campos de análise de feeds já estão normalizados para UTC, pois podem ser verificados na documentação de análise de data, portanto isso é redundante.datetime
objeto que é perdido quandofeedparser
analisa datas de string brutas.