Saxon PE与EE 9.9.1.5处理负日期的format-date表达式结果差异原因咨询
Saxon不同发行版下format-date返回值差异的原因
前置规则说明
首先明确XPath与XML Schema日期模型的固定约定:
- 规范定义的公历日期时间体系不存在公元0年
- 年值的内部存储与实际历史纪年存在固定换算关系:
- 公元1年对应内部存储年值
1 - 公元前1年对应内部存储年值
0 - 公元前N年对应内部存储年值
-(N-1)
- 公元1年对应内部存储年值
- 测试用例中的
xs:date('-0800-01-01'),对应的内部存储年值为-800,换算后实际为公元前801年。
差异产生的核心原因
本次9.9.1.5版本的返回值偏差,本质是Saxon不同授权版本内置了两套独立维护的日期格式化实现代码,对公元前负年值的处理逻辑没有对齐:
- Saxon-PE 9.9.1.5 使用轻量简化的日期处理路径,实现上优先保证计算性能,对
[Y]格式标记的处理直接取日期内部存储年值的绝对值输出,针对“无公元0年”的偏移规则未做适配,因此对内部年值-800直接输出800。 - Saxon-EE 9.9.1.5 使用完整的高精度公历计算路径,会应用内部年值与历史纪年的偏移补偿规则,但在9.9.1.5这个版本中,对负年值的补偿偏移量存在计算偏差,在取内部年值绝对值的基础上多扣减了1个年的数值,因此最终输出
799。
补充说明:该类边缘场景的实现差异是Saxon 9.9.x系列的已知兼容问题,在后续发布的10.x及以上版本中,开发团队将PE与EE的日期格式化核心逻辑做了统一,对齐了负年值的计算规则,两边返回值已经完全一致。本次oXygen v22.0的测试环境不存在配置错误,所有返回值偏差都来自两个Saxon发行版内置的实现差异。
内容的提问来源于stack exchange,提问作者joshp123
相关产品推荐
相关产品推荐

