оба ваших объекта даты и времени являются «наивными», что означает, что они не знают о летнем времени. datetime.now()
возвращает текущее время работы вашей машины, которое может включать DST. То же самое касается datetime.fromtimestamp(os.path.getmtime())
.
# 1 - локализация ваших объектов datetime может быть вариантом;что-то вроде
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 - другой вариант, использующий преобразование UTC с 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 - как VPfB указывает в своем ответе, os.path.getmtime
возвращает метку времени UTC (проверьте документы по модулю и документы по модулю ). Таким образом, самое простое решение - пропустить преобразование в datetime
и использовать только метки времени UTC;например, получение текущей метки времени UTC как time.time()
.
Работа с часовыми поясами может свести вас с ума ... но есть некоторые хорошие ресурсы, например, этот средний пост .