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 para datetime.fromtimestamp(os.path.getmtime())
.
# 1 - localizar seus objetos de data e hora pode ser uma opção; algo como
from datetime import datetime
import tzlocal
now_aware = tzlocal.get_localzone().localize(datetime.now())
file_mtime = datetime.fromtimestamp(os.path.getmtime(file))
# assuming the file was created on a machine in the same timezone (!):
file_mtime_aware = now_aware.tzinfo.localize(file_mtime)
age = now_aware - file_mtime_aware
# 2 - outra opção, usando a conversão UTC com datetime
:
now = datetime.utcnow()
age = now - datetime.utcfromtimestamp(os.path.getmtime(file_name))
if (age.seconds + age.days * 24 * 3600) < -180:
print(f'WARN: file has timestamp from future?: {age} s')
# 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 como time.time()
.
Trabalhar com fusos horários pode deixá-lo louco ... mas há alguns bons recursos por aí, por exemplo, este post médio .