在xslt中将dateTime转换为unix epoch

11
我有一个dateTime变量,我想将它转换为epoch的十进制值。 如何做到这一点?
我尝试使用:
seconds-from-duration($time, xs:dateTime('1970-01-01T00:00:00'))

但它只返回 0。

请给予建议。 谢谢。


你的问题的答案是:0。seconds-from-duration()函数只是从提供的xs:duration中提取秒组件的值。显然,你想要将持续时间转换为所有秒数,然后计算任何可能的“纪元”。请更正你的问题。 - Dimitre Novatchev
请参考以下链接了解“纪元”的定义:http://en.wikipedia.org/wiki/Unix_time。基本上,它是从1970年1月1日(UTC)开始计算的秒数。 - Anna
看到我的答案就知道解决方案了。 :) 给你的问题点个赞。 - Dimitre Novatchev
3个回答

17

This transformation:

这个转换:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="text"/>

 <xsl:template match="/">
   <xsl:sequence select="current-dateTime()"/>

   <xsl:sequence select=
   "( current-dateTime() - xs:dateTime('1970-01-01T00:00:00') )
    div
     xs:dayTimeDuration('PT1S')
     "/>
 </xsl:template>
</xsl:stylesheet>

当应用于任何XML文档(未被使用),会产生期望的结果——当前日期时间和其Unix纪元(自1970年1月1日以来的秒数)

2010-08-12T06:26:54.273-07:00    1281594414.273

1
+1 用于除以 xs:duration(我正在提取每个组件,因此我已删除答案)。但我一直在想,是否为 *nix 纪元定义了 时区 - user357812

4

一个关于纯XSL 1.0库的示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="https://github.com/ilyakharlamov/pure-xsl/date"
    version="1.0">
    <xsl:import href="https://raw.github.com/ilyakharlamov/pure-xsl/master/date.xsl"/>
    <xsl:template match="/">
        <xsl:variable name="time_as_timestamp" select="1365599995640"/>
        <xsl:text>time_as_timestamp:</xsl:text><xsl:value-of select="$time_as_timestamp"/><xsl:text>&#x0A;</xsl:text>
        <xsl:variable name="time_as_xsdatetime">
            <xsl:call-template name="date:date-time">
                <xsl:with-param name="timestamp" select="$time_as_timestamp"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:text>time_as_xsdatetime:</xsl:text><xsl:value-of select="$time_as_xsdatetime"/><xsl:text>&#x0A;</xsl:text>
        <xsl:text>converted back:</xsl:text>
        <xsl:call-template name="date:timestamp">
            <xsl:with-param name="date-time" select="$time_as_xsdatetime"/>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

输出:

time_as_timestamp:1365599995640
time_as_xsdatetime:2013-04-10T13:19:55.640Z
转换回来的值:1365599995640


1
考虑到LibXML2在2015年仍不支持XPath 2.0函数,这个答案非常棒,完全节省了我大量的时间。谢谢! - aendra

0

作为一种不使用除法但从持续时间中提取的xpath:

for $i in (current-dateTime()-xs:dateTime('1970-01-01T00:00:00Z')) 
    return ((days-from-duration($i)*86400)+(hours-from-duration($i)*3600)+(minutes-from-duration($i)*60)+(seconds-from-duration($i)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接