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

ruamel.yaml类datetime格式值解析异常及判定标准咨询

ruamel.yaml 解析datetime/date类型的判断标准

ruamel.yaml的日期解析严格遵循YAML 1.2规范的时间戳标签规则,只有同时满足以下所有条件的标量值才会被解析为date/datetime对象:

  • 格式完全匹配YYYY-MM-DD(日期)或YYYY-MM-DDTHH:MM:SS[.ffffff][±HH:MM](带时间/时区的日期时间)规则:
    • 年份必须为4位及以上的正整数(你测试的111-12-26年份只有3位,不满足规则,所以不会被解析为日期)
    • 月份为01-12区间的两位数字
    • 日期为对应月份的合法日期,比如2月的日期不能超过28/29,4月不能超过30等
  • 整个标量值没有多余的前后缀字符(你测试的2000-12-26111末尾多了3位数字,不符合格式要求,所以直接作为字符串处理)
  • 标量值没有被单引号/双引号包裹,被引号包裹的值会直接作为字符串处理

报错原因

符合规则的日期值会被解析为datetime.date类型对象,Python内置的json.dumps默认不支持date、datetime类型的序列化,因此会抛出类型错误。

解决方法

方法1:禁用ruamel.yaml的日期解析功能

在初始化YAML实例后添加以下代码,覆盖默认的时间戳构造器,让所有符合日期格式的内容都作为字符串加载:

from ruamel.yaml.constructor import SafeConstructor
yaml.constructor.add_constructor(
    'tag:yaml.org,2002:timestamp',
    SafeConstructor.construct_scalar
)

方法2:给json.dumps添加自定义序列化处理器

处理date、datetime类型的对象,转换为字符串后再序列化:

import datetime
def json_default(obj):
    if isinstance(obj, (datetime.date, datetime.datetime)):
        return obj.isoformat()
    raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable')

# 调用dumps时传入default参数
check = json.dumps(data, indent=4, ensure_ascii=False, default=json_default)

内容的提问来源于stack exchange,提问作者Puter.B166ER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:00:04