[XSLT] Convertir un timestamp en date

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

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

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>
Résultat

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>
Ce code n'a pas été beaucoup testé, donc c'est à vos risques et périls.

Petit nouveau ! | 1 Messages

29 oct. 2009, 19:20

Merci pour ce code, ça vient de me servir pour passer de serendipity à dotclear... :oops: