在 xslt 中将 dateTime 转换为 unix 纪元

Posted

技术标签:

【中文标题】在 xslt 中将 dateTime 转换为 unix 纪元【英文标题】:Convert dateTime to unix epoch in xslt 【发布时间】:2011-03-28 22:07:20 【问题描述】:

我有一个 dateTime 变量,我想将它转换为纪元的十进制值。 如何做到这一点?

我尝试使用:

seconds-from-duration($time, xs:dateTime('1970-01-01T00:00:00'))

但它只返回 0。

请指教。 谢谢。

【问题讨论】:

您的问题的答案是:0。 seconds-from-duration() 只是从提供的 xs:duration 中提取秒组件的值。您显然希望将持续时间转换为所有秒数,然后计算可能的“纪元”。请更正您的问题。 关于纪元的定义见下文:en.wikipedia.org/wiki/Unix_time。基本上,它是从 1970 年 1 月 1 日(UTC)开始的秒数 查看我的答案以获得解决方案。 :) 为您的问题 +1。 【参考方案1】:

这种转变

<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 除以 xs:duration (我正在提取每个组件,所以我删除了答案)。但我一直在思考是否为 *nix epoch 定义了 time zone【参考方案2】:

pure xsl 1.0 lib 示例:

<?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

【讨论】:

考虑到 LibXML2 still 不支持 XPath 2.0 函数——在 20-freaking-15 中——这个答案太棒了,完全为我节省了大量的时间。谢谢!【参考方案3】:

作为不使用除法但从持续时间中提取的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)))

【讨论】:

以上是关于在 xslt 中将 dateTime 转换为 unix 纪元的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas.Series 中将时间戳转换为 datetime.datetime

在查询中将 DateTime.Ticks 转换为 MySQL DateTime

在 Python 3.4 中将 datetime.time 转换为 datetime.timedelta

在 PHP 中将 DOMTimeStamp 转换为 DATETIME

如何在 C# 中将字符串转换为 DateTime?

在 Python 中将 datetime.date 转换为 UTC 时间戳