从stat().st_mtime到datetime?

Tra*_*ggs 33 python datetime stat python-3.x pathlib

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)
Run Code Online (Sandbox Code Playgroud)

似乎围绕一个回合,有点令人惊讶,我必须在那里硬编码Unix时代.有更直接的方式吗?

Tak*_*re_ 43

尝试 datetime.fromtimestamp(statResult.st_mtime)

例如

import datetime

mod_timestamp = datetime.datetime.fromtimestamp(path.getmtime(<YOUR_PATH_HERE>))
Run Code Online (Sandbox Code Playgroud)

  • 要清楚,这是`datetime` _class_上的替代构造函数(`classmethod`),而不是`datetime` _module_的函数.因此,如果您只在文件顶部有`import datetime`,那么您需要`datetime.datetime.fromtimestamp(...)`.另外,假设OP使用的是`pathlib`,而不是`os.path`,那应该是`Path(<YOUR_PATH_HERE>).stat().st_mtime`; 他们甚至都没有导入`os`,所以在OP的上下文中使用`os.path`中的`path.getmtime`会有点混乱. (6认同)
  • 这将在您的Python语言环境中获取一个datetime对象。文件系统中保留的mtime应该以秒和纳秒的形式记录为UTC。 (2认同)
  • @ShadowRanger 是对的,这个答案有很多错误,包括链接。 (2认同)
  • 有关为什么可以将文件 mtime 转换为 UTC 日期时间的更多信息,请参阅[此答案](/sf/ask/1614376081/#23062640)。简而言之,mtime 以自纪元以​​来的秒数为单位(该计算中不涉及时区),并且纪元被定义为 UTC。 (2认同)

Sam*_*fer 15

如果你想要一个可读的字符串,这对我有用:

import datetime
mtime = path.stat().st_mtime
timestamp_str = datetime.datetime.fromtimestamp(mtime).strftime('%Y-%m-%d-%H:%M')
Run Code Online (Sandbox Code Playgroud)

  • 很高兴将其更改为 ISO 8601 和 RFC 3339 '%Y-%m-%d %H:%M:%S' 或 '%Y-%m-%dT%H:%M:%S' 等标准请参阅 https://medium.com/easyread/understanding-about-rfc-3339-for-datetime-formatting-in-software-engineering-940aa5d5f68a (4认同)