同配置服务器下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
相关产品推荐
相关产品推荐

