如何使用XSLT将ticks转换为可读的日期时间?

时间:2009-03-13 14:09:39

标签: datetime xslt xslt-2.0

我有一个带有这样的时间戳的XML:

<node stamp="1236888746689" />

我想在结果HTML中将它们显示为时间日期。 有没有办法用XSLT(任何版本)来做?

修改 我正在使用XSLT2.0和Saxon9。基准日期是1970-01-01 0:00。

5 个答案:

答案 0 :(得分:17)

您选择日期1970-01-01T00:00:00并添加与图章值告诉您的毫秒数:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/TR/xhtml1/strict">

    <xsl:template match="node">
        <xsl:value-of
select='xs:dateTime("1970-01-01T00:00:00") + @stamp * xs:dayTimeDuration("PT0.001S")'/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:9)

如果您使用的是支持EXSLT date functions的XSLT 1.0处理器(我刚刚在PHP中使用libxslt对其进行了测试),您可以使用date:add()date:duration()

<xsl:value-of select="date:add('1970-01-01T00:00:00Z', date:duration(@stamp div 1000))"/>

date:duration()函数需要几秒钟(因此您必须将毫秒除以1000)并将其转换为“持续时间”(在本例中为“P14315DT20H12M26.6889998912811S”),这是然后使用date:add()添加到您的纪元的开头(看起来像标记的纪元,用于此印章)以获得“2009-03-12T20:12:26.6889998912811Z”的标记。然后,您可以使用EXSLT日期函数或仅substring()对其进行格式化,具体取决于您的需要。

答案 2 :(得分:4)

迟来的答案,是的,我知道,但我找不到我在这里寻找的那个,所以我想我会用我的解决方案支付它。

我的XML是使用export_node和drush从Drupal转储的一些节点。我在PHP5中使用xslt处理器,它只支持xslt 1.0。某些EXSLT函数似乎受支持,但我无法判断我的语法是否错误或者我试图使用的函数不受支持。无论如何,以下工作对我有用。我使用了w3schools.com的示例代码,但在声明xsltprocessor之后添加了一行,如下所示:

$ xp = new XsltProcessor();
$ XP-&GT; registerPHPFunctions();

PHP有一个简单的日期转换功能,所以我欺骗并使用了PHP处理器,因为我已经用它来转换我的xsl。

<xsl:for-each select="node_export/node">
  <xsl:value-of select="php:function('date', 'n-j-y', number(timestamp))"/>
</xsl:for-each>

希望这有助于那里的人。当我把它拿出来的时候,我正在敲打我的脑袋已经有一段时间了。

答案 3 :(得分:1)

如果你想使用不支持EXSLT date and time functions的XSL 1.0处理器,这是非常重要的,但已经完成了。

您可以查看Katy Coe's XSLT 1.0 implementation of the "iso-from-unix" function。它是她创造的一套相当庞大的“非商业用途免费使用”日期和时间功能的一部分。

但是,您的XSL处理器必须支持"http://exslt.org/functions"命名空间才能使此实现正常工作。除此之外,不依赖于EXSLT。

P.S。:我知道Unix时间戳和刻度不是完全相同的东西。但他们已经足够接近了。

答案 4 :(得分:0)

XSLT是Turing complete,所以必须有办法。 :)至少知道一点XSLT,它可能会涉及递归。

你没有指定你的“滴答声”的确切解释,我猜测自某个时代以来毫秒,但是哪个? 1970?