在XSLT1.0或XSLT2.0中将12小时格式日期转换为24小时

时间:2016-03-07 06:51:23

标签: xslt xslt-1.0 xslt-2.0

我需要将日期从12小时格式转换为24小时格式。

输入: 01/27/2016 07:01:36 PM

预期输出 201601271901(表示为yyyymmddhhmm)

我在我的代码中使用了format-dateTime()函数,我收到错误

<xsl:value-of select="format-dateTime(part_need/promised_dt,'[Y0001][M01][D01][H01][m01]')"/>

错误:

描述:FORG0001:无效的dateTime值&#34; 01/27/2016 07:01:36 PM&#34; (非数字年份组件)

请帮助解决这个问题

2 个答案:

答案 0 :(得分:0)

format-dateTimexs:dateTime?作为第一个参数。 part_needed/promised_dtnode

如果您有标准ISO格式的日期时间(例如“2006-01-27T19:01:36”),则可以使用xs:dateTime(part_needed/promised_dt)

Saxon没有非标准的日期时间解析器助手,因此您需要使用xs:dateTime(xs:date(year,month,day), xs:time(hours, minutes, seconds))构造函数并使用类似substring(part_needed/promised_dt,1,2)的内容来获取每个日期/时间部分。

答案 1 :(得分:0)

您的输入不是有效的ISO 8601日期/时间,因此您无法使用内置的日期/时间功能。

尝试使用(XSLT 2.0):

<xsl:template match="inputdate">
    <xsl:copy>
        <xsl:variable name="dte" select="tokenize(.,'/|\s|:')" />
        <xsl:value-of select="$dte[3]" />
        <xsl:value-of select="$dte[1]" />
        <xsl:value-of select="$dte[2]" />
        <xsl:variable name="h24" select="xs:integer($dte[4]) mod 12 + 12 * xs:integer($dte[7]='PM')" />
        <xsl:value-of select="format-number($h24, '00')" />
        <xsl:value-of select="$dte[5]" />
    </xsl:copy>
</xsl:template>

请注意,这假设您的日期是零填充到两位数(就像您的月份一样)。

如果您需要在多个地方使用此功能,请考虑将其转换为功能。