Преобразовать метку времени в дату с помощью XSLT 1.0 - PullRequest
0 голосов
/ 28 сентября 2019

Как я могу преобразовать метку времени в xslt 1.0 без расширений EXSLT или функций даты.

<timestamp>1569509813</timestamp>

Я думал, что это будет тривиально, но это не так.

1 Ответ

1 голос
/ 28 сентября 2019

Чтобы преобразовать Время Unix в дату-время ISO 8601 в XSLT 1.0:

<xsl:template name="UnixTime-to-dateTime">
    <xsl:param name="unixTime"/>

    <xsl:variable name="JDN" select="floor($unixTime div 86400) + 2440588" />
    <xsl:variable name="secs" select="$unixTime mod 86400" />   

    <xsl:variable name="f" select="$JDN + 1401 + floor((floor((4 * $JDN + 274277) div 146097) * 3) div 4) - 38"/>
    <xsl:variable name="e" select="4*$f + 3"/>
    <xsl:variable name="g" select="floor(($e mod 1461) div 4)"/>
    <xsl:variable name="h" select="5*$g + 2"/>

    <xsl:variable name="d" select="floor(($h mod 153) div 5 ) + 1"/>
    <xsl:variable name="m" select="(floor($h div 153) + 2) mod 12 + 1"/>
    <xsl:variable name="y" select="floor($e div 1461) - 4716 + floor((14 - $m) div 12)"/>

    <xsl:variable name="H" select="floor($secs div 3600)"/>
    <xsl:variable name="M" select="floor($secs mod 3600 div 60)"/>
    <xsl:variable name="S" select="$secs mod 60"/>

    <xsl:value-of select="$y"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="format-number($m, '00')"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="format-number($d, '00')"/>
    <xsl:text>T</xsl:text>
    <xsl:value-of select="format-number($H, '00')"/>
    <xsl:text>:</xsl:text>
    <xsl:value-of select="format-number($M, '00')"/>
    <xsl:text>:</xsl:text>
    <xsl:value-of select="format-number($S, '00')"/>
</xsl:template> 

Демонстрация: https://xsltfiddle.liberty -development.net / ncntCRZ /2


Для XSLT 2.0 см .: https://stackoverflow.com/a/32977307/3016153

...