Pregunta

Uso de XSLT 1.0 y fechas de recepción en el siguiente formato:

20111129060804

Y tengo la necesidad de poder calcular las diferencias entre dos de ellas. Sin embargo, No puedo usar ninguna extensión.

También tengo otras limitaciones:

  • Estoy limitado en cuanto a los espacios de nombres que se pueden usar dentro de un XSLT,
  • y donde estoy usando la hoja de estilo XSL (una aplicación de terceros), no procesará correctamente ninguna acción de inclusión/importación dentro del XSL.

Entonces, en efecto, el XSLT que necesito usar debe ser bastante autoinclusivo, ya que lo que se llama o referenciado debe estar en el XSLT en sí.

Había pensado en tomar la fecha y la hora y convertirlo en un número de serie de Julian y manejar la fecha en matemáticas de la forma en que Excel lo hace. Ejemplo -

09/14/2011 08:19:37 = 40800.346956018500000
09/15/2011 12:22:46 = 40801.515810185200000
difference 1 day 4 hours 3 minutes and 9 seconds
difference = 1.168854166666280

Donde todo lo que queda del decimal está en días, y todo el derecho del decimal está a tiempo (es decir, .1688541666666280 * 24 = 4.052499999990680, o 4 horas y .0525 por ciento de una hora, o 3.15 minutos).

¿Alguien ha hecho este tipo de matemáticas de fecha transcurrida en XSLT 1.0 sin el uso de extensiones?

Agradecería cualquier pensamiento, sugerencia o referencia si hay un conjunto existente de código que puedo volver a usar.

EDITAR -

Decidí continuar con lo anterior y he presionado un problema con la conversión del tiempo.

El ejemplo que estoy usando es: Hora de inicio = 08:19:37 Hora de finalización = 15:58:33

que es una duración/diferencia de 7:38:56 (por cierto, esto es solo para el cálculo del mismo día: tengo que lanzar un error si el tiempo de inicio <la hora de inicio o si el día es> 0).

Para llegar en ese momento, convierto todo en segundos y luego hago los cálculos. 08:19:37 se convierte en 29977 (8 * 3600 durante horas + 19 * 60 durante minutos + segundos). 15:58:33 se convierte en 57513 (15 * 3600 durante horas + 58 * 60 durante minutos + segundos).

La diferencia es 27536 segundos.

Obtengo: 27536/3600 = 7.6488888888888888888 <- La parte entera es horas, entonces la diferencia de 27536- 25200 = 2336 <- el 25200 = 7 horas * 3600 segundos 2336/60 = 38.9333333333333333 <- La parte del Integer es 38 minutos 38 minutos Luego, la diferencia de 2336 - 2280 = 56 segundos desde arriba.

Sin embargo, si trato de tomar la parte entera de estos números, está sujeto a redondeo.

<xsl:template name="time-difference">  
<xsl:param name="from-hour"/>  
<xsl:param name="from-minute"/>  
<xsl:param name="from-second"/>  
<xsl:param name="to-hour"/>  
<xsl:param name="to-minute"/>  
<xsl:param name="to-second"/>  
<xsl:variable name="f-secs" select="($from-hour * 3600) + ($from-minute * 60) + ($from-second)"/>  
<xsl:variable name="t-secs" select="($to-hour * 3600) + ($to-minute * 60) + ($to-   second)"/>  
<xsl:variable name="sec-diff" select="$t-secs - $f-secs"/>  
<xsl:variable name="daysec-diff" select="format-number(($sec-diff div 86400),'#')"/>  
<xsl:variable name="q" select="($sec-diff div 3600)"/>  
<xsl:variable name="t-hrs-diff" select="format-number(($sec-diff div 3600),'00')"/>  

La variable Q anterior tiene 7.64888888888888888888 (lo cual es correcto) Sin embargo, el T-HRS-Diff una vez que el número de formato ocurre ahora tiene "08", haciendo que mi tiempo sea incorrecto.

Sé que cualquier otro intento de formato de agarrar la parte entera del número daría como resultado un redondeo.

Fuera de la subcadena & subcadena - Cuál debería (pienso) Haz que tengo que convertir el resultado en un número antes de usar en el siguiente cálculo: ¿hay alguna otra forma de agarrar la parte entera inalterada del número y no tener que hacer una conversión de una cadena a otra para usar las piezas?

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top