从
stat()
调用检索到的修改时间转换为 datetime
对象的最惯用/有效的方法是什么?我想出了以下内容(python3):
from datetime import datetime, timedelta, timezone
from pathlib import Path
path = Path('foo')
path.touch()
statResult = path.stat()
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
modified = epoch + timedelta(seconds=statResult.st_mtime)
print('modified', modified)
似乎是一轮,有点令人惊讶的是我必须在那里硬编码 Unix 纪元。有没有更直接的方法?
datetime.datetime.fromtimestamp
,即
from datetime import datetime, timezone
...
stat_result = path.stat()
timezone_naive_modified = datetime.fromtimestamp(stat_result.st_mtime)
print('timezone-naive modified datetime: ', timezone_naive_modified)
如果您希望
modified
具有时区意识 datetime
,您可以使用 datetime.fromtimestamp(stat_result.st_mtime, tz=timezone.utc)
。然而,实际上添加这种无根据的验证会产生误导,因为并非所有操作系统中的所有文件在保存时都带有 UTC 日期时间标记。即使您自己的操作系统这样做,文件当然也可以来自任何地方。时区天真的 datetime
永远不应该被任意提升为时区感知的。这可能会导致一些完全令人困惑的错误和异常情况。
如果你想要一个可读的字符串,这对我有用:
import datetime
mtime = path.stat().st_mtime
timestamp_str = datetime.datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M')
我相信
file.stat().st_time
是一个POSIX时间戳(即一个数字,无论是int
还是float
)。
因此,在我看来,这正是时区朴素值的定义。
除非...记住文件可以保存在一个操作系统上,然后复制/移动到另一个操作系统(以及从一个时区到另一个时区)...所以除非您可以确定保存文件的每种方法每个可能的操作系统中的文件都需要麻烦地使用 UTC 值进行标记...但情况似乎并非如此:例如,请参见here。 Windoze(惊讶!)似乎并不总是使用 UTC 值进行保存。
我注意到提问者提到了“Unix 纪元”,尽管不清楚他的操作系统是什么。但正如我所说,即使是 Unix 操作系统用户也可以从其他地方接收文件。
所以在我看来,没有理由将此值转换为时区感知值。相反:
naive_last_modif_datetime = datetime.fromtimestamp(path.stat().st_mtime)
事实上,让错误验证(在本例中是
datetime
的 tz 意识)被无意中插入会造成极大的误导,并且可能会导致一些非常奇怪和令人困惑的异常情况。