Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 11/03/2024 12:09:46

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 67
Website

"Variabiliser" le mois et le jour d'une date locale pour les tester

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 &gt;&#160;</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>&#160;</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> &gt;&#160;</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>&#160;</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

#2 11/03/2024 12:38:49

Cédric Damioli
Ametys Product Manager
From: Toulouse
Registered: 10/08/2010
Posts: 323

Re: "Variabiliser" le mois et le jour d'une date locale pour les tester

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

#3 11/03/2024 12:52:44

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 67
Website

Re: "Variabiliser" le mois et le jour d'une date locale pour les tester

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

#4 11/03/2024 13:14:52

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 67
Website

Re: "Variabiliser" le mois et le jour d'une date locale pour les tester

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

Board footer

Powered by FluxBB