在 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>
</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>
</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