Este código imprime um aviso falso uma vez por ano, na noite do relógio (horário de verão da Europa Central para horário da Europa Central):
import os
import datetime
now = datetime.datetime.now()
age = now - datetime.datetime.fromtimestamp(os.path.getmtime(file_name))
if (age.seconds + age.days * 24 * 3600) < -180:
print('WARN: file has timestap from future?: %s' % age)
Como fazer esse código funcionar mesmo durante esse turno anual de uma hora?
Atualizar
Eu me importo apenas com a idade, não com a data e hora.
seus dois objetos de data e hora são "ingênuos", o que significa que eles não sabem sobre o horário de verão.
datetime.now()
retorna o horário atual em que sua máquina é executada e isso pode incluir o horário de verão. O mesmo vale paradatetime.fromtimestamp(os.path.getmtime())
.# 1 - localizar seus objetos de data e hora pode ser uma opção; algo como
# 2 - outra opção, usando a conversão UTC com
datetime
:# 3 - como VPfB aponta em sua resposta,
os.path.getmtime
retorna um carimbo de data / hora UTC (verifique os documentos do módulo e os documentos do módulo de tempo ). Portanto, a solução mais fácil poderia ser ignorar a conversão e,datetime
em primeiro lugar, usar apenas carimbos de data / hora UTC; por exemplo, obter o registro de data e hora UTC atual comotime.time()
.Trabalhar com fusos horários pode deixá-lo louco ... mas há alguns bons recursos por aí, por exemplo, este post médio .
fonte
Seu problema é que você está conseguindo seu tempo sem que o fuso horário esteja ciente. Portanto, quando os relógios mudam, você termina comparando um carimbo de data / hora anterior ao relógio e outro após o relógio mudar e seu código não vê isso.
Em vez disso, você deve fazer com que seus objetos de data e hora sejam baseados em um fuso horário específico para não ter problemas com a alteração de relógios. Recomendamos o uso do módulo pytz para ajudá-lo. Você pode ver uma lista dos fusos horários disponíveis nesta resposta: Existe uma lista de fusos horários do Pytz?
Aqui está um exemplo de código simples de como você pode fazer isso com objetos com reconhecimento de fuso horário:
fonte
age = time.time() - os.path.getmtime(file_name)
. Estou interessado apenas na idade (delta do tempo) e não na data e hora.