You are not logged in.
Bonjour à tous,
je souhaite extraire (substring) et tester juste le jour et le mois de l'événement en abrégé selon si les jours et mois de début et de fin sont identique (sans tenir compte des heures).
Exemples :
4 mar. (jours et mois identiques)
2 > 3 fév. (mois idientiques et jours différents)
1 jan. > 2 fév. (jours et mois différents)
Mais quand l'événement commence le 29/02 à 00h00 et finit le 29/02 à 03h00 les dates (jj/mm) côté serveur sont en UTC et donc différentes car je récupèrerais toujours le 28/02 comme jour et mois (à 23h00 en hiver et 22h00 en été) de début et le 29/02 comme jour et mois de fin (à 02h00 en hiver et 01h00 en été) :-(
La fonction sameDate() semble identique à sameDateTime() et même si elle ignorerait l'heure, vu qu'on est en UTC et pas en CET côté serveur on aurait toujours "un jour de décalage à minuit" :-(
Le plus énervant c'est que l'affichage final avec <i18n:date/> fonctionne bien pour l'affichage "côté client" mais impossible de convertir en locale côté serveur pour en faire une variable à tester.
Le problème est-il solvable en xsl, car malgré mes nombreux essais, aucune fonction de CONVERSION DE LA DATE d'UTC en CET ne semble fonctionner correctement ?
<!-- STAMP : affichage des dates abrégées dans les vues lien des remontées de contenu actus-->
<xsl:template name="stampdates">
<xsl:param name="startDate"/>
<xsl:param name="endDate"/>
<!-- CONVERSION la date UTC en date locale-->
<!-- <xsl:variable name="localStartDate" select="javazoneddatetime:toLocalDate($startDate)"/> -->
<!-- <xsl:variable name="localStartDate" select="javazoneddatetime:toLocalDateTime(dateutils:parseZonedDateTime($startDate, xs:dayTimeDuration('+01:00')))"/> -->
<!-- <xsl:variable name="localStartDate" select="javazoneddatetime:toLocalDateTime(dateutils:parseZonedDateTime($startDate, $CET))"/> -->
<!-- <xsl:variable name="localStartDate" select="xs:adjust-dateTime-to-timezone(dateTime($startDate), xs:dayTimeDuration('+01:00'))"/> -->
<!-- <xsl:variable name="localStartDate" select="$startDate"/> -->
<!-- <xsl:variable name="localStartDate"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="yyyy-MM-dd"><xsl:value-of select="$startDate"/></i18n:date></xsl:variable> -->
<!-- <xsl:variable name="localStartDate">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
</xsl:call-template>
</xsl:variable> -->
<xsl:variable name="localStartDate"><i18n:date pattern="yyyy-MM-dd" src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" locale="fr_FR"><xsl:value-of select="$startDate"/></i18n:date></xsl:variable>
<!-- <xsl:variable name="localEndDate" select="javazoneddatetime:toLocalDate($endDate)"/> -->
<!-- <xsl:variable name="localEndDate" select="javazoneddatetime:toLocalDateTime(dateutils:parseZonedDateTime($endDate, xs:dayTimeDuration('++01:00')))"/> -->
<!-- <xsl:variable name="localEndDate" select="javazoneddatetime:toLocalDateTime(dateutils:parseZonedDateTime($endDate, $CET))"/> -->
<!-- <xsl:variable name="localEndDate" select="xs:adjust-dateTime-to-timezone(dateTime($endDate), xs:dayTimeDuration('+01:00'))"/> -->
<!-- <xsl:variable name="localEndDate" select="xs:adjust-dateTime-to-timezone(dateTime($endDate), xs:dayTimeDuration('+PT01H'))"/> -->
<!-- <xsl:variable name="localEndDate" select="$endDate"/> -->
<!-- <xsl:variable name="localEndDate"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="yyyy-MM-dd"><xsl:value-of select="$endDate"/></i18n:date></xsl:variable> -->
<!-- <xsl:variable name="localEndDate">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$endDate"/>
</xsl:call-template>
</xsl:variable> -->
<xsl:variable name="localEndDate"><i18n:date pattern="yyyy-MM-dd" src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" locale="fr_FR"><xsl:value-of select="$endDate"/></i18n:date></xsl:variable>
<!-- On extrait et variabilise les jours et les mois des dates de début et de fin pour ignorer les heures lors des comparaisons -->
<!-- <xsl:variable name="startday"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="dd" value="$startDate"/></xsl:variable>
<xsl:variable name="startmonth"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="MM"><xsl:value-of select="$startDate"/></i18n:date></xsl:variable>
<xsl:variable name="endday"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="dd" value="$endDate"/></xsl:variable>
<xsl:variable name="endmonth"><i18n:date src-pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX" pattern="MMM" value="$endDate"/></xsl:variable> -->
<!-- <xsl:variable name="startday"><xsl:value-of select="substring($localStartDate,9,2)" /></xsl:variable> -->
<!-- <xsl:variable name="startday">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
<xsl:with-param name="rendu" select="'dd'"/>
</xsl:call-template>
</xsl:variable> -->
<xsl:variable name="startday"><xsl:value-of select="substring($localStartDate,9,2)" /></xsl:variable>
<xsl:variable name="startmonth"><xsl:value-of select="substring($localStartDate,6,2)" /></xsl:variable>
<xsl:variable name="endday"><xsl:value-of select="substring($localEndDate,9,2)" /></xsl:variable>
<xsl:variable name="endmonth"><xsl:value-of select="substring($localEndDate,6,2)" /></xsl:variable>
<!-- Afffichage conditionné : JJ1 et MMM1 | JJ1 > JJ2 et MMM1 | JJ1 et MMM1 > JJ2 et MMM2 -->
<div class="stamp-date">
<!-- pour visu VALEURS DES VARIABLES : début-->
D1: <xsl:value-of select="$startDate"/><br/>
LocD1: <xsl:value-of select="$localStartDate"/><br/>
D2: <xsl:value-of select="$endDate"/><br/>
LocD2: <xsl:value-of select="$localEndDate"/><br/>
-------<br/>
J1: <xsl:value-of select="$startday"/><br/>
M1: <xsl:value-of select="$startmonth"/><br/>
J2: <xsl:value-of select="$endday"/><br/>
M2: <xsl:value-of select="$endmonth"/><br/>
<!-- pour visu VALEURS DES VARIABLES : fin-->
<xsl:choose>
<!--Uniquement date de début-->
<xsl:when test="$startDate and not($endDate)">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
</xsl:call-template>
<!-- cas1 -->
</xsl:when>
<!--Uniquement date de fin-->
<xsl:when test="$endDate and not($startDate)">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$endDate"/>
</xsl:call-template>
<!-- cas2 -->
</xsl:when>
<xsl:when test="$startmonth = $endmonth">
<xsl:choose>
<!--"jour début" = "jour de fin" et "mois debut" = "mois de fin" (pour ignorer les heures)-->
<!-- <xsl:when test="datetime:sameDate($localStartDate, $localEndDate)"> -->
<xsl:when test="$startday = $endday">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
</xsl:call-template>
<!-- cas3 -->
</xsl:when>
<!-- "jour début" diff "jour de fin" et "mois debut" = "mois de fin" (jour différent mais mois identique)-->
<xsl:otherwise>
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
<xsl:with-param name="rendu" select="'dd'"/>
</xsl:call-template>
<xsl:text>pouet > </xsl:text>
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$endDate"/>
<xsl:with-param name="rendu" select="'dd'"/>
</xsl:call-template>
<br />
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
<xsl:with-param name="rendu" select="'MMM'"/>
</xsl:call-template>
<!-- cas4 -->
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<!-- "mois debut" diff "mois de fin" (jour identiques/différents et mois différents)-->
<xsl:when test="$startmonth != $endmonth">
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
<xsl:with-param name="rendu" select="'dd'"/>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$startDate"/>
<xsl:with-param name="rendu" select="'MMM'"/>
</xsl:call-template>
<br /><xsl:text> > </xsl:text>
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$endDate"/>
<xsl:with-param name="rendu" select="'dd'"/>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:call-template name="news-stamp-date-pattern">
<xsl:with-param name="date" select="$endDate"/>
<xsl:with-param name="rendu" select="'MMM'"/>
</xsl:call-template>
<!-- cas5 -->
</xsl:when>
</xsl:choose>
</div>
</xsl:template>
Offline
Bonjour,
Le transformer i18n est exécuté *après* la XSL, donc on ne peut pas tenir compte des résultats i18n dans les calculs XSL.
Par contre on peut en effet reproduire le même comportement en appelant des helper Java.
quel est le helper javazoneddatetime ? Parce que si on a accès à l'API Java, le mieux est de passer par la méthode ZonedDateTime.withZoneSameInstant pour passer de UTC à CET
Ce qui donnerait :
<xsl:variable name="localStartDate" select="javazoneddatetime:withZoneSameInstant(dateutils:parseZonedDateTime($startDate), zoneId:of('+01:00'))"/>
en déclarant zoneId comme avec la classe java.time.ZoneId
Je n'ai pas testé, mais ça devrait fonctionner
Cédric
Offline
Merci Cédric,
pour le helper
xmlns:javazoneddatetime="java.time.ZonedDateTime"
Je vais tester ta solution et te tiens au courant.
PS : et merci pour la precision sur l'exexcution d'i18n "apres" xsl c'est ce que j'avais pressenti mais c'est mieux d'en avoir la confirmation
Offline
Et... miracle cela fonctionne, alléluhia, merci beaucoup Cédric.
les helper à rajouter
xmlns:dateutils="org.ametys.core.util.DateUtils"
xmlns:javazoneddatetime="java.time.ZonedDateTime"
xmlns:javazoneid="java.time.ZoneId"
extension-element-prefixes="javazoneddatetime javazoneid dateutils">
Offline