Python 记录时间时为什么要保留时区
【摘要】 使用带时区的 datetime 保存记录,将 UTC 转换成北京时间,避免把无时区时间解释错。
任务记录中的“09:00”如果没有时区,换一台电脑或交给另一个服务后就可能被解释成别的时刻。datetime 可以携带时区信息,保存时使用带偏移的 ISO 格式,展示时再换成本地约定的时区。
保存 UTC,展示北京时间
from datetime import datetime, timezone, timedelta
beijing = timezone(timedelta(hours=8), "Asia/Shanghai")
created = datetime.now(timezone.utc)
stored = created.isoformat()
restored = datetime.fromisoformat(stored)
if restored.tzinfo is None:
raise ValueError("记录缺少时区信息")
print("保存值:", stored)
print("北京时间:", restored.astimezone(beijing).isoformat())
print("秒级时间戳:", restored.timestamp())
timestamp 表示从 Unix 纪元起的秒数,不是格式化日期。不同语言的接口有时使用毫秒,应先确认单位,不能看到十几位数字就直接传入 fromtimestamp。恢复时间戳时可以指定 timezone.utc,再用 astimezone 转换。
赋予时区与转换时区不同
给无时区对象调用 replace(tzinfo=...) 是声明“这个墙上时间属于某时区”,不会移动时钟值;astimezone 才是对同一时刻做时区转换。二者混用会让任务提前或延后。来源不明的无时区日期,应先确定它原本代表哪里的时间。
示例固定使用 UTC+8,适合当前北京时间记录。如果需要处理跨地区夏令时或历史日期,应在 Python 3.9 及以上考虑 zoneinfo,并确认运行环境的时区数据库可用。保存层使用明确格式,展示层标明时区,能减少日志和定时计划之间的歧义。
参考:Python datetime 文档。
https://docs.python.org/3/library/datetime.html
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)