一个 Python 纪元时间戳时区陷阱

主要观点:软件中的日期和时间处理是痛点,Python 过去有不明智选择,此文旨在反映其中陷阱并修正示例。
关键信息

  • 时区无知的日期时间对象是最大祸首,应避免使用。
  • 时区感知的日期时间对象与时区标识符配对,可用于相对计算。
  • 纪元时间戳是相对比较时间的较好方式,但需满足特定条件。
  • 从时间戳转换为datetime对象时要注意本地时区设置。
    重要细节
  • Python 允许存在时区无知的日期时间对象,处理日期时应避免。
  • 时区感知对象可通过包含时区标识符来消除歧义并进行计算。
  • 纪元时间戳从 1970 年 1 月 1 日开始,通常在 2038 年前有效且忽略闰秒。
  • time.time()获取的时间戳是相对 UTC 的整数,datetime.datetime.now()返回本地时区的时区无知对象。
  • 若本地系统时区不是 UTC,datetime.datetime.now()datetime.datetime.utcnow()结果不同。
  • 避免使用datetime.datetime.utcnow(),推荐使用datetime.datetime.now(datetime.timezone.utc)
  • 若闰秒重要,可参考 IANA 时区数据库的转换表,但通常意味着出错。
  • time.time()返回值是浮点数,讨论中为简化用整数,且不保证单调递增。
阅读 14
0 条评论