XSLT 2.0如何将xsd:dateTime格式转换为带毫秒与时区偏移的时间格式
问题原因
你的现有代码存在两处核心问题:
- 未对原始UTC时间做时区调整,且picture字符串中写死了
Z字符,导致输出始终保留原始UTC时区标识 - 没有指定正确的时区偏移输出标记,无法生成你需要的
+04:00格式的时区信息
解决方法
方案1:将UTC时间转换为UTC+4时区的当地时间(时分秒自动+4小时)
这是符合时区转换逻辑的常规方案,输入2021-10-20T15:30:46Z时输出为2021-10-20T19:30:46.000+04:00:
- 用
adjust-dateTime-to-timezone()函数将原始时间调整到+4时区,参数传入时区偏移时长xs:dayTimeDuration('PT4H') - 修改picture字符串,将写死的
Z替换为[Z,3-3],该标记会自动输出±HH:MM格式的时区偏移 [f001]会强制输出3位毫秒,不足自动补0
完整代码示例:
<!-- 需确保已声明XMLSchema命名空间 --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 其他逻辑 --> <xsl:value-of select="format-dateTime( adjust-dateTime-to-timezone($DateTime, xs:dayTimeDuration('PT4H')), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z,3-3]' )" /> </xsl:stylesheet>
方案2:保留原时分秒数值,仅替换时区标识
如果你明确需要保留原时间的时分秒不变,仅将时区标识改为+04:00,输入2021-10-20T15:30:46Z时输出你示例要求的2021-10-20T15:30:46.000+04:00,可以用字符串截取构造新的dateTime对象再格式化:
<xsl:value-of select="format-dateTime( xs:dateTime(concat(substring(string($DateTime), 1, 19), '+04:00')), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z,3-3]' )" />
内容的提问来源于stack exchange,提问作者Abdul Kader
相关产品推荐
相关产品推荐

