[XSLT] Convertir un timestamp en date
Posté : 22 oct. 2007, 21:07
Je doute que ça serve vraiment à quelqu'un, mais sait-on jamais, quelqu'un tombera dessus via Google.
Le fichier XSLT 1.0 suivant permet de convertir un timestamp Unix en date, à la manière de la fonction date() de PHP. Tous les formats ne sont pas disponibles, mais la plupart pourraient être ajoutés assez aisément.
Pour l'utiliser, définir un élément <xxx:date> contenant le timestamp. Cet élément possède deux attributs optionnels, xxx:format (voire date()) et xxx:tz_offset (fuseau horaire en seconde, 0, ou UTC, par défaut).
Exemple :
datetime.xml
Résultat
datetime.xsl
This block of code is PUBLIC DOMAIN, reuse at will, at your very own risk.
Ce code n'a pas été beaucoup testé, donc c'est à vos risques et périls.
Le fichier XSLT 1.0 suivant permet de convertir un timestamp Unix en date, à la manière de la fonction date() de PHP. Tous les formats ne sont pas disponibles, mais la plupart pourraient être ajoutés assez aisément.
Pour l'utiliser, définir un élément <xxx:date> contenant le timestamp. Cet élément possède deux attributs optionnels, xxx:format (voire date()) et xxx:tz_offset (fuseau horaire en seconde, 0, ou UTC, par défaut).
Exemple :
datetime.xml
Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="datetime.xsl" ?>
<messages xmlns:xxx="urn:xxx">
<message>
<user>foo</user>
<posted_at><xxx:date>1199104496</xxx:date></posted_at>
</message>
<message>
<user>bar</user>
<posted_at><xxx:date xxx:format="d/m/Y à g\hi a" xxx:tz_offset="3600">1199104496</xxx:date></posted_at>
</message>
</messages>Code : Tout sélectionner
<p>foo @ 2007-12-31 12:34:56</p>
<p>bar @ 31/12/2007 à 1h34 pm</p>datetime.xsl
This block of code is PUBLIC DOMAIN, reuse at will, at your very own risk.
Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="urn:xxx">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
<xsl:template match="/">
<html>
<head>
<title>x</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="message">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="message/user">
<xsl:value-of select="concat(., ' @ ')" />
</xsl:template>
<xsl:template match="xxx:date">
<xsl:call-template name="xxx:format_date">
<xsl:with-param name="dt">
<xsl:call-template name="xxx:parse_ts">
<xsl:with-param name="ts">
<xsl:choose>
<xsl:when test="./@xxx:tz_offset">
<xsl:value-of select=". + ./@xxx:tz_offset" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="format">
<xsl:choose>
<xsl:when test="./@xxx:format">
<xsl:value-of select="./@xxx:format" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'Y-m-d H:i:s'" />
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="xxx:format_date">
<xsl:param name="dt" />
<xsl:param name="format" />
<xsl:param name="i" select="1" />
<xsl:variable name="c" select="substring($format, $i, 1)" />
<xsl:variable name="escaping">
<xsl:choose>
<xsl:when test="$c = '\'">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$c = 'Y'">
<xsl:value-of select="substring($dt, 1, 4)" />
</xsl:when>
<xsl:when test="$c = 'm'">
<xsl:value-of select="substring($dt, 6, 2)" />
</xsl:when>
<xsl:when test="$c = 'd'">
<xsl:value-of select="substring($dt, 9, 2)" />
</xsl:when>
<xsl:when test="$c = 'H'">
<xsl:value-of select="substring($dt, 12, 2)" />
</xsl:when>
<xsl:when test="$c = 'i'">
<xsl:value-of select="substring($dt, 15, 2)" />
</xsl:when>
<xsl:when test="$c = 's'">
<xsl:value-of select="substring($dt, 18, 2)" />
</xsl:when>
<xsl:when test="$c = 'j'">
<xsl:value-of select="number(substring($dt, 9, 2))" />
</xsl:when>
<xsl:when test="$c = 'n'">
<xsl:value-of select="number(substring($dt, 6, 2))" />
</xsl:when>
<xsl:when test="$c = 'y'">
<xsl:value-of select="substring($dt, 3, 2)" />
</xsl:when>
<xsl:when test="$c = 'g'">
<xsl:variable name="h" select="substring($dt, 12, 2)" />
<xsl:choose>
<xsl:when test="($h = 12) or ($h = 24)">12</xsl:when>
<xsl:otherwise><xsl:value-of select="$h mod 12" /></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$c = 'G'">
<xsl:value-of select="number(substring($dt, 12, 2))" />
</xsl:when>
<xsl:when test="$c = 'h'">
<xsl:variable name="h" select="substring($dt, 12, 2)" />
<xsl:choose>
<xsl:when test="($h = 12) or ($h = 24)">12</xsl:when>
<xsl:when test="$h < 12"><xsl:value-of select="$h" /></xsl:when>
<xsl:when test="$h < 22">0<xsl:value-of select="$h - 12" /></xsl:when>
<xsl:otherwise>11</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$c = 'a'">
<xsl:choose>
<xsl:when test="substring($dt, 12, 2) < 12">am</xsl:when>
<xsl:otherwise>pm</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$c = 'A'">
<xsl:choose>
<xsl:when test="substring($dt, 12, 2) < 12">PM</xsl:when>
<xsl:otherwise>PM</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$escaping = 1">
<xsl:value-of select="substring($format, $i + 1, 1)" />
</xsl:when>
<xsl:otherwise>
<xsl:if test="$escaping = 0">
<xsl:value-of select="$c" />
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="string-length($format) > ($i + $escaping)">
<xsl:call-template name="xxx:format_date">
<xsl:with-param name="dt" select="$dt" />
<xsl:with-param name="format" select="$format" />
<xsl:with-param name="i" select="$i + 1 + $escaping" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="xxx:parse_ts">
<xsl:param name="ts" />
<xsl:variable name="format" select="'Y-m-d H:i:s'" />
<xsl:variable name="days" select="floor($ts div 86400)" />
<xsl:variable name="qs" select="floor(($days - 730) div 1461)" />
<xsl:variable name="doq" select="$days - ($qs * 1461 + 730)" />
<xsl:variable name="doy">
<xsl:choose>
<xsl:when test="$doq > 365">
<xsl:value-of select="($doq - 366) mod 365" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$doq" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="year">
<xsl:choose>
<xsl:when test="$doq > 365">
<xsl:value-of select="1972 + $qs * 4 + floor(($doq - 1) div 365)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1972 + $qs * 4" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="month">
<xsl:variable name="pad">
<xsl:choose>
<xsl:when test="($year mod 4 = 0) and ($doy > 58)">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$doy - $pad < 31">1</xsl:when>
<xsl:when test="$doy - $pad < 59">2</xsl:when>
<xsl:when test="$doy - $pad < 90">3</xsl:when>
<xsl:when test="$doy - $pad < 120">4</xsl:when>
<xsl:when test="$doy - $pad < 151">5</xsl:when>
<xsl:when test="$doy - $pad < 181">6</xsl:when>
<xsl:when test="$doy - $pad < 212">7</xsl:when>
<xsl:when test="$doy - $pad < 243">8</xsl:when>
<xsl:when test="$doy - $pad < 273">9</xsl:when>
<xsl:when test="$doy - $pad < 304">10</xsl:when>
<xsl:when test="$doy - $pad < 334">11</xsl:when>
<xsl:otherwise>12</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="day">
<xsl:variable name="fdom">
<xsl:choose>
<xsl:when test="$month = 1">0</xsl:when>
<xsl:when test="$month = 2">31</xsl:when>
<xsl:when test="$month = 3">59</xsl:when>
<xsl:when test="$month = 4">90</xsl:when>
<xsl:when test="$month = 5">120</xsl:when>
<xsl:when test="$month = 6">151</xsl:when>
<xsl:when test="$month = 7">181</xsl:when>
<xsl:when test="$month = 8">212</xsl:when>
<xsl:when test="$month = 9">243</xsl:when>
<xsl:when test="$month = 10">273</xsl:when>
<xsl:when test="$month = 11">304</xsl:when>
<xsl:otherwise>334</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="($year mod 4 = 0) and ($doy > 59)">
<xsl:value-of select="$doy - $fdom" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1 + $doy - $fdom" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="h" select="floor($ts div 3600) mod 24" />
<xsl:variable name="m" select="floor($ts div 60) mod 60" />
<xsl:variable name="s" select="$ts mod 60" />
<xsl:value-of select="concat($year, '-')" />
<xsl:if test="$month < 10">0</xsl:if>
<xsl:value-of select="concat($month, '-')" />
<xsl:if test="$day < 10">0</xsl:if>
<xsl:value-of select="concat($day, ' ')" />
<xsl:if test="$h < 10">0</xsl:if>
<xsl:value-of select="concat($h, ':')" />
<xsl:if test="$m < 10">0</xsl:if>
<xsl:value-of select="concat($m, ':')" />
<xsl:if test="$s < 10">0</xsl:if>
<xsl:value-of select="$s" />
</xsl:template>
</xsl:stylesheet>