Détermination du jour de la semaine à partir d'une date
Pour trouver le jour de la semaine correspondant à une date, il faut disposer d'un calendrier perpétuel.
L'algorithme de Claus Tondering est une manière élégante de calculer un calendrer perpétuel.
Un algorithme élégant ne nécessite pas de tables de correspondance et permet ainsi un code compact, simple à réaliser.
<xsl:template name="calendrier-perpetuel">
<xsl:param name="date"/><!-- date au format yyyymmdd -->
<!-- calendrier perpétuel
selon l'algorithme de Claus Tondering :
Claus Tondering propose l'algorithme ci-dessous, où les divisions sont entières et leurs restes ignorés,
sauf ceux relatifs à la division par 7 (ou modulo 7).
a = (14 - M) ÷ 12
avec M = rang du mois, avec M = 1 à 12: jan=1, fév=2, mars=3, avril=4, mai=5, juin=6, juil=7, août=8, sep=9, oct=10, nov=11, et déc=12
y = Y - a où Y = année entière à 4 chiffres
m = M + 12a - 2
j = Jour où j = 1 à 31; max de 31 jours dans un mois
Pour le calendrier Julien (dates avant le 15 octobre 1582) :
d = [5 + j + y + y/4 + (31m)/12] mod 7
Pour le calendrier Grégorien (dates depuis le 15 octobre 1582, inclusivement) :
d = [j + y + y/4 - y/100 + y/400 + (31m)/12] mod 7
-->
<xsl:variable name="yyyy" select="substring($date,1,4)"/>
<xsl:variable name="yy" select="substring($date,3,2)"/>
<xsl:variable name="mm" select="substring($date,5,2)"/>
<xsl:variable name="dd" select="substring($date,7,2)"/>
<xsl:variable name="a" select="floor(( 14 - $mm ) div 12)"/>
<xsl:variable name="y" select="$yyyy - $a"/>
<xsl:variable name="m" select="$mm + (12 * $a) - 2"/>
<xsl:variable name="d">
<xsl:choose>
<xsl:when test="$date < 15821015"><xsl:value-of select="(5 + $dd + $y + floor($y div 4) + floor((31 * $m) div 12)) mod 7"/></xsl:when> <!-- cas du calendrier julien -->
<xsl:otherwise><xsl:value-of select="($dd + $y + floor($y div 4) - floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/></xsl:otherwise> <!-- calendrier grégorien -->
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$d = 0">dimanche</xsl:when>
<xsl:when test="$d = 1">lundi</xsl:when>
<xsl:when test="$d = 2">mardi</xsl:when>
<xsl:when test="$d = 3">mercredi</xsl:when>
<xsl:when test="$d = 4">jeudi</xsl:when>
<xsl:when test="$d = 5">vendredi</xsl:when>
<xsl:when test="$d = 6">samedi</xsl:when>
</xsl:choose>
</xsl:template>
Pour utiliser le calendrier perpétuel, il suffit juste de l'appeler de cette façon :
<xsl:call-template name="calendrier-perpetuel">
<xsl:with-param name="date" select="$ma_date"/>
</xsl:call-template>