datetime.now() 返回无时区本地时间,跨时区易出错;格式化需注意%Y/%y、%H/%I、%m/%M大小写区分;推荐用timezone.utc或ZoneInfo指定时区,保持datetime对象计算、仅输出时格式化。

直接用 datetime.now() 获取本地当前时间,用 strftime() 控制输出格式——这是最常用也最容易出错的组合。
为什么 datetime.now() 有时返回的时间不对
它默认返回系统本地时区的时间,但不带时区信息(tzinfo=None),在跨时区或需要精确时间戳的场景下会出问题。比如服务器部署在UTC时区而你期望东八区时间,就可能差8小时。
- 如果只要本地显示(如日志、界面展示),
datetime.now()足够用 - 如果涉及网络协作、数据库存储或定时任务,优先用
datetime.now(timezone.utc)或显式指定时区(如pytz.timezone('Asia/Shanghai')) - 注意:Python 3.9+ 推荐用
zoneinfo.ZoneInfo替代pytz,例如datetime.now(ZoneInfo('Asia/Shanghai'))
strftime() 格式化字符串里哪些符号最常写错
大小写敏感、容易混淆的占位符是高频错误源,尤其 %Y 和 %y、%H 和 %I、%m 和 %M。
-
%Y是4位年份(2024),%y是2位(24)——写反会导致年份错乱 -
%H是24小时制(00–23),%I是12小时制(01–12)——漏掉末尾字母 I 容易打成%h(实际是英文缩写月份) -
%m是月(01–12),%M是分(00–59)——大小写颠倒会导致输出完全不符预期 - 常见安全写法:
datetime.now().strftime('%Y-%m-%d %H:%M:%S')(标准 ISO 风格,无歧义)
想导出为字符串又想保留 datetime 对象做计算,怎么办
不要反复调用 strftime() 或 str(),更别用字符串拼接来“还原”时间——一旦格式变动,解析极易失败。
立即学习“Python免费学习笔记(深入)”;
- 保持原始
datetime对象用于计算(如dt + timedelta(hours=1)) - 仅在最终输出环节用
strftime()转字符串 - 如果必须双向转换,用
strptime()解析,但前提是字符串格式严格固定;否则优先考虑dateutil.parser.parse()(需安装python-dateutil) - 警惕
datetime.fromtimestamp(time.time())这类间接方式——它和now()行为一致,但多一层转换,没额外收益
真正麻烦的不是怎么格式化,而是忘记时区语义或混用字符串与对象做比较运算——这两个点一旦出错,调试成本远高于写几行格式化代码。


















