迁移至XPath3.1&Saxon10后,current-dateTime()精度调整咨询
恢复XPath 3.1/Saxon 10中
current-dateTime()的3位毫秒输出格式 可以通过以下几种方式恢复此前的3位毫秒精度输出行为:
1. 显式使用格式化函数(推荐)
直接用format-dateTime()指定输出格式,彻底摆脱版本默认行为的影响,这是最可靠的方式:
format-dateTime(current-dateTime(), "[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]")
该格式字符串会强制将秒的小数部分限制为3位,正好对应毫秒精度,输出结果与Saxon 9时期一致。
2. 调整Saxon配置参数
针对Saxon 10及后续版本,可以通过配置修改默认的日期时间序列化规则:
- Java API场景:在
Configuration对象中调用setDateTimeFormatter(),传入仅保留3位毫秒的格式化规则; - 命令行场景:添加
--suppress-microseconds参数(部分版本支持,需核对对应版本文档); - XSLT/XQuery场景:设置全局序列化参数
date-time-format,指定目标格式。
3. 手动截断微秒部分
如果不想修改配置或使用格式化函数,也可以通过XPath表达式手动截断精度:
current-dateTime() - xs:dayTimeDuration(concat('PT', substring-after(substring-after(string(current-dateTime()), '.'), '+'), 'S')) + xs:dayTimeDuration(concat('PT', substring-before(substring-after(string(current-dateTime()), '.'), '+'), 'S'))
这种方法通过计算截断微秒部分,实现精度调整,但逻辑相对繁琐,不如格式化函数直观。
注意:current-dateTime()返回的xs:dateTime值本身仍保留完整精度,只是序列化输出格式发生了变化。如果业务仅关注输出格式,优先使用format-dateTime()方案,兼容性和可读性最佳。
内容的提问来源于stack exchange,提问作者Siddhant K.
相关产品推荐
相关产品推荐

