You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同配置服务器下datetime.strptime解析时间报错求助

问题描述

两台配置一致的Ubuntu 22.04服务器,均运行Python 3.10.6。第一台服务器执行以下代码可正常运行:

Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date_time_str = 'Tue 28 Feb 2023 11:27:38 AM CET'
>>> date_time_obj = datetime.strptime(date_time_str, '%a %d %b %Y %I:%M:%S %p %Z')
>>> print ("The type of the date is now",  type(date_time_obj))
The type of the date is now <class 'datetime.datetime'>
>>> print ("The date is", date_time_obj)
The date is 2023-02-28 11:27:38

但第二台服务器执行完全相同的代码时,抛出如下错误:

Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date_time_str = 'Tue 28 Feb 2023 11:27:38 AM CET'
>>> date_time_obj = datetime.strptime(date_time_str, '%a %d %b %Y %I:%M:%S %p %Z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.10/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/lib/python3.10/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data 'Tue 28 Feb 2023 11:27:38 AM CET' does not match format '%a %d %b %Y %I:%M:%S %p %Z'

格式符本身正确,请问导致该问题的原因可能是什么?

可能的原因分析
  • 系统区域设置(locale)不一致:datetime.strptime解析%a(星期缩写)、%b(月份缩写)、%p(AM/PM标识)时完全依赖系统的locale配置。如果第二台服务器的LC_TIME或LC_ALL设置为非英文locale(比如fr_FR.UTF-8、de_DE.UTF-8),就无法识别Tue、Feb、AM这些英文标识,直接触发匹配错误。

    • 验证方式:在两台服务器上执行locale命令,对比LC_TIME字段的取值;也可以在Python中执行import locale; print(locale.getlocale(locale.LC_TIME))查看当前时间区域设置。
    • 临时修复:在代码开头添加import locale; locale.setlocale(locale.LC_TIME, 'en_US.UTF-8'),强制指定英文时间区域。
  • 时区数据库或系统时区配置异常:%Z用于解析时区缩写(如CET),若第二台服务器的时区数据库未正确包含CET的映射,或者系统时区未配置为支持CET的时区,会导致strptime无法匹配时区部分,进而抛出错误。

    • 验证方式:执行timedatectl查看系统时区配置;或在Python中执行import datetime; print(datetime.datetime.now().astimezone().tzname()),确认是否能正确识别CET类时区缩写。
  • Python环境的隐性差异:虽然版本号相同,但两台服务器的Python可能安装了不同的系统补丁,或者_strptime模块的底层依赖库存在差异。不过这种情况概率极低,建议优先排查前两项。

内容的提问来源于stack exchange,提问作者user2433624

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:03:31