Last updated on

Python时间函数对比:getmtime() vs getctime() vs getatime() vs ctime()


Python 时间函数对比:

getmtime() vs getctime() vs getatime() vs ctime()

在 Python 中处理文件缓存、同步、过期判断时,经常会遇到一组容易混淆的时间函数:

  • os.path.getmtime()
  • os.path.getctime()
  • os.path.getatime()
  • time.ctime()

它们名字相似,但语义、用途、可靠性完全不同。本文从底层含义 + 实际工程使用两个角度,系统梳理它们的区别。


一、先给结论(工程速查表)

函数字母含义真正含义是否推荐
getmtime()m = modification文件内容修改时间✅ 强烈推荐
getctime()c = change文件状态/元数据变更时间⚠️ 谨慎
getatime()a = access文件最后访问时间❌ 很少用
time.ctime()c = convert时间戳 → 字符串✅ 仅用于显示

二、getmtime() —— 文件内容修改时间(最重要)

os.path.getmtime(path)

含义

  • mtime = Modification Time
  • 文件内容被修改的时间

什么时候会更新?

  • 写入文件
  • 覆盖文件
  • 保存文件
with open("data.csv", "w") as f:
    f.write("hello")

👉 mtime 一定会变化


工程中的典型用途(推荐)

  • 判断缓存是否过期
  • 是否需要重新下载远程文件
  • 文件同步逻辑
import time, os

if time.time() - os.path.getmtime(path) > 3600:
    refresh_cache()

📌 结论

99% 的“文件是否更新”判断,应该用 getmtime()


三、getctime() —— 文件状态变更时间(最容易误解)

os.path.getctime(path)

含义

  • c = Change
  • 文件元数据发生变化的时间

⚠️ 不是 Creation Time(创建时间)


什么时候会更新?

  • 修改权限(chmod)
  • 修改所有者(chown)
  • 重命名文件
  • 移动文件
  • 修改内容(顺带也会更新)

👉 即使文件内容没变ctime 也可能变化


平台差异(非常关键)

系统ctime 含义
Linux / macOSChange Time(状态变更)
Windows接近 Creation Time(创建时间)

📌 Python 是跨平台的,但底层语义来自 Unix。


是否推荐使用?

不推荐用于缓存或内容判断

原因:

  • 语义不稳定
  • 容易被“改权限 / 移动文件”误触发

四、getatime() —— 文件访问时间(基本不用)

os.path.getatime(path)

含义

  • a = Access
  • 文件被“读取”的时间

为什么几乎不用?

  • 读取文件就会更新
  • 许多系统为了性能会关闭 atime 更新
  • 不适合做任何业务判断

📌 除非你在写底层文件系统工具,否则可以忽略


五、time.ctime() —— 时间戳转字符串(不是文件时间)

time.ctime(timestamp)

注意重点

  • 不是文件函数
  • 不读取文件
  • 只是把“时间戳”转成可读字符串

示例

import time, os

ts = os.path.getmtime("data.csv")
print(time.ctime(ts))

输出:

Tue Dec 31 10:45:21 2025

适合做什么?

✅ 日志 ✅ 打印 ✅ 调试

❌ 时间计算 ❌ 业务逻辑


六、为什么 ctime 名字这么容易混淆?

Unix 世界的三件套

名称含义
atimeaccess time
mtimemodification time
ctimechange time

这是 Unix / POSIX 标准命名,Python 只是照搬。


再强调一次(重要)

  • getctime()c ≠ create
  • time.ctime()c ≠ change

它们只是名字相似,语义不同


七、推荐的正确组合(工程级)

判断文件是否过期

from datetime import datetime, timedelta
import os

mtime = datetime.fromtimestamp(os.path.getmtime(path))

if datetime.now() - mtime > timedelta(hours=1):
    refresh()

仅用于展示时间

print("文件更新时间:", time.ctime(os.path.getmtime(path)))

八、最终总结(必须记住)

  • 判断内容是否更新 → getmtime()
  • 不要把 getctime() 当创建时间
  • time.ctime() 只负责“显示”

如果你正在做 缓存 / 同步 / 下载控制 / Google Sheets 本地化, 那么:

getmtime() 是你唯一可靠的选择。