【问题标题】:From stat().st_mtime to datetime?从 stat().st_mtime 到 datetime?
【发布时间】:2017-01-14 12:22:37
【问题描述】:

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 纪元进行硬编码。有没有更直接的方法?

【问题讨论】:

    标签: python python-3.x datetime stat pathlib


    【解决方案1】:

    你可以使用datetime.datetime.fromtimestamp,即

    from datetime import datetime, timezone
    ...
    stat_result = path.stat()
    modified = datetime.fromtimestamp(stat_result.st_mtime, tz=timezone.utc)
    print('modified', modified)
    

    【讨论】:

    • 需要明确的是,这是datetime 上的替代构造函数(classmethod),而不是datetime 模块的函数>。因此,如果文件顶部只有import datetime,则需要datetime.datetime.fromtimestamp(...)。此外,鉴于 OP 使用的是pathlib,而不是os.path,那应该是Path(<YOUR_PATH_HERE>).stat().st_mtime;他们甚至从未导入 os,因此在 OP 的上下文中使用来自 os.pathpath.getmtime 可能会有些混乱。
    • 我已更正它以显示与导入日期时间一起使用两次的日期时间。
    • 这将在 Python 的语言环境中获取一个日期时间对象。保存在文件系统中的 mtime 应该以秒和纳秒为单位记录为 UTC。
    • @ShadowRanger 是对的,这个答案有很多错误,包括链接。
    • 我建议添加时区参考
    【解决方案2】:

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

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

    【讨论】:

    • 这就是答案。
    • 很高兴将其更改为 ISO 8601 和 RFC 3339 '%Y-%m-%d %H:%M:%S' 或 '%Y-%m-%dT%H :%M:%S' 更多见medium.com/easyread/…
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2014-12-03
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多