在XSLT 2.0中将Epoch转换为带有时区的日期和时间

3

如何在xslt 2.0中基于时区将纪元时间转换为日期和时间?

例如,纪元时间1212497304转换为:

GMT: Tue, 03 Jun 2008 12:48:24 GMT 时区: martes, 03 de junio de 2008 14:48:24 GMT+2

这是因为夏令时(DST)的缘故:在许多国家,夏季会多出一个小时,而具体日期因年份而异。

例如,假设以下指令:

<xsl:value-of select=" format-dateTime(xs:dateTime('2013-07-07T23:08:00+00:00'), '[D] [MNn] [Y] [h]:[m01][PN,*-2] [Z] ([C])', 'en', 'AD', 'IST') "/>

将给定的GMT日期事件转换为印度标准时间(IST)与公历(Gregorian Calendar)相对应,但它只会打印:

7 July 2013 11:08PM +00:00 (Gregorian)

因此它不会改变时区。 要改变时区,我们必须使用:

adjust-dateTime-to-timezone

但是此函数仅接受以小时/分钟为单位的持续时间,而不是时区,因此处理器会确定是否存在DST。

请给予任何建议,谢谢。


我认为你指的是Unix时间,而不是纪元时间(这是一个没有意义的表达)。无论如何,如果你只有GMT时间,你不能确定当地时间是多少,除非查阅Olson数据库。我不知道如何仅使用XSLT来解决这个问题。 - michael.hor257k
1个回答

1

编辑:这并不是对实际问题的答案,实际问题是如何获取正确的本地时间并尊重其时区,但我仍然会将其保留在这里,因为它可能对某些人有用。

因为纪元只是自 Unix 时间以来经过的秒数,所以您可以像这样将其添加到 Unix 时间中:

Unix 时间是自 1970 年 1 月 1 日午夜起经过的秒数,您可以这样做:

<xsl:value-of select="xs:dateTime('1970-01-01T00:00:00') + xs:dayTimeDuration('PT1212497304S')"
    />

这将给出正确的xs:dateTime,为2008-06-03T12:48:24。
放入一个函数中:
<xsl:function name="fn:epochToDate">
    <xsl:param name="epoch"/>
    <xsl:variable name="dayTimeDuration" select="concat('PT',$epoch,'S')"/>
    <xsl:value-of select="xs:dateTime('1970-01-01T00:00:00') + xs:dayTimeDuration($dayTimeDuration)"/>
</xsl:function>

epoch 只是自 Unix 时间以来经过的秒数。小问题:Unix 时间是自 1970 年 1 月 1 日午夜起经过的秒数,而不是反过来。无论如何,我认为这个问题是(或曾经是)关于将 Unix(即 GMT)时间转换为本地时间的。 - michael.hor257k
@michael.hor257k 嗯,你说得对,那篇文章确实是写得比较匆忙。至于实际问题,当你只读了一半的帖子并且已经有了那一半的答案时,就会出现这种情况。我会更新我的回答,但是还是保留在这里,我认为有人可能仍然会觉得它有用 :) - Tobias Klevenz

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