cả hai đối tượng datetime của bạn đều 'ngây thơ', nghĩa là họ không biết về DST. datetime.now()
trả về thời gian hiện tại máy của bạn chạy và có thể bao gồm DST. Cùng đi cho datetime.fromtimestamp(os.path.getmtime())
.
# 1 - nội địa hóa các đối tượng datetime của bạn có thể là một tùy chọn; cái gì đó như
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 - một tùy chọn khác, sử dụng chuyển đổi UTC với 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 - với tư cách là VPfB chỉ ra trong câu trả lời của mình, os.path.getmtime
trả về dấu thời gian UTC (kiểm tra tài liệu mô-đun os và tài liệu mô-đun thời gian ). Vì vậy, giải pháp đơn giản nhất có thể là bỏ qua chuyển đổi sang datetime
vị trí đầu tiên và chỉ sử dụng dấu thời gian UTC; ví dụ: lấy dấu thời gian UTC hiện tại là time.time()
.
Làm việc với các múi giờ có thể khiến bạn phát điên ... nhưng có một số tài nguyên tốt ngoài đó, vd bài đăng trung bình này .