使用XSLT将时间戳转换为UTC时区

时间:2016-06-07 05:48:21

标签: xslt

我的XML格式有时间戳,如 2016-06-07T07:46:04

我想使用xslt转换UTC格式的时间戳,如 1465278364

怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我实际上已经专门为此编写了一个命名模板。这是:

<xsl:template name="converttime">
  <xsl:param name="date" select="."/>
  <xsl:choose>
    <xsl:when test="translate($date,'123456789','000000000') = '0000-00-00T00:00:00'">
      <xsl:value-of select="
        (
          ((substring($date,1,4) - 1970) * 365) + 
          floor((substring($date,1,4) - 1970) div 4) +
          substring(
           '000,031,059,090,120,151,181,212,243,273,304,334,365',
           substring($date,6,2)*4-3, 3
          ) +
          (substring($date,9,2)-1) +
          (1-floor(((substring($date,1,4) mod 4) + 2) div 3))*floor((substring($date,6,2)+17) div 20)
        ) * 86400 +
        (substring($date,12,2)*3600) +
        (substring($date,15,2)*60) +
        substring($date,18,2)
      "/>
    </xsl:when>

    <!-- Unknown format -->
    <xsl:otherwise>-1</xsl:otherwise>
  </xsl:choose>
</xsl:template>

这加起来:

  • 自1970年以来的年数乘以365。
  • 自1970年以来的闰年数(即闰日数)
  • 指定月份的年初以来的天数(未考虑闰年)
  • 自月初以来的天数
  • 1如果是闰年,月份是3月或更晚,否则为0(这个公式非常可怕,如果你真的想要一个解释,请在评论中告诉我,我会把它分解)

然后将上述所有内容乘以一天中的秒数 然后,只需添加小时*(一小时内的秒数),分钟*(一分钟内的秒数)和秒数就可以了。

您可以通过将不同的<xsl:when>元素放在不同的日期模式中来支持不同的日期格式,并显然调整子字符串调用以匹配。

老实说,如果您不能使用XSLT 2.0(或更高版本)或扩展功能,请仅使用此功能。另外,我注意到你给出的数字是7200秒而不是产生的数字,但是如果你所处的时区与UTC不同2小时,那可能就是原因了。