/ / Seconds to Time blisko pełnej minuty wydaje się niepoprawnie przeliczać - xslt, xslt-1.0

Sekundy do czasu w pobliżu pełnej minuty wydają się niepoprawnie przekształcać - xslt, xslt-1.0

Wystąpił problem, którego nie jestem pewien, jak rozwiązać. Użyłem odpowiedzi w Seconds to Time aby utworzyć szablon w XSLT 1.0. Jednak gdy mój czas trwania zbliża się do liczby całkowitej, wynik jest niepoprawny. Po uruchomieniu z wartościami znacznie większymi lub mniejszymi wynik wydaje się prawidłowy.

Mój szablon jest jak poniżej. Kiedy mam Czas trwania na 3597, wynik pojawia się o 00:60:57 zamiast 00:59:57, a czas trwania 955 daje wynik 00:16:55 zamiast 00:15:55.

Próbowałem usunąć moduł z myśląże mógłbym po prostu podciągnąć wynik, ale to nie zmieniło wyniku 3597 i pomieszało wiele wyników, które są poprawne w poniższym kodzie. Rozszerzyłem również numer formatu, aby zawierał więcej cyfr, ale to również nie zmienia wynik. Próbowałem także użyć floor ($ Czas trwania - $ godziny div 60), ale to nie działało lub źle sformatowałem.

czego mi brakuje? Nie rozumiem, jak 3597/60 może równać się 60, zwłaszcza gdy biorę moduł.

<xsl:template name="calculatedDuration">
<xsl:param name="Duration"/>
<xsl:choose>
<xsl:when test="$Duration &gt;= 3600">
<xsl:value-of select="concat(format-number($Duration div 3600, "00"), ":")"/>
</xsl:when>
<xsl:otherwise>00:</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="format-number($Duration div 60 mod 60, "00")"/>
<xsl:value-of select="concat(":", format-number($Duration mod 60, "00"))"/>
</xsl:template>

Odpowiedzi:

1 dla odpowiedzi № 1

To dlatego, że format-number wykonuje zaokrąglanie, a nie obcinanie. format-number(59.97, "00") ma wartość 60, a nie 59. Więc użyj format-number(floor($Duration div 60) mod 60, "00") zamiast.