/ / XSL do konwersji czasu UTC na lokalną datę / godzinę z porównaniem przesunięcia - java, datetime, xslt, xslt-1.0, utc

XSL do konwersji czasu UTC na lokalny datetime z porównaniem przesunięcia - java, datetime, xslt, xslt-1.0, utc

Otrzymujemy elementy datetime względem czasu UTC jak 2004-04-12T13:20:00Z.

Chcielibyśmy wygenerować datetime w lokalnej datetime, który jest wyrażony z przesunięciem w stosunku do czasu UTC, jak 2004-04-12T12:20:00-01:00.

Czy ktoś może pomóc w osiągnięciu tego w XSLT?
Czy istnieje szablon funkcji do osiągnięcia tego celu?

Odpowiedzi:

2 dla odpowiedzi № 1

Aby przekonwertować podaną wartość dateTime na obecny lokalna strefa czasowa, użyj adjust-dateTime-to-timezone() funkcja, bez określania timezone parametr.

Na przykład:

<xsl:variable name="datetime">2004-04-12T13:20:00Z</xsl:variable>
<xsl:value-of select="adjust-dateTime-to-timezone($datetime)"/>

wróci:

2004-04-12T12:20:00-01:00

jeśli w czasie transformacji czas lokalny twojego systemu jest przesunięty o -1 godzinę od czasu UTC.


Ważny:

Może to nie przynieść oczekiwanych rezultatów, jeśli twojeprzesunięcie czasu lokalnego od UTC nie jest stałe, ale zmienia się ze względu na czas letni. Aby przekonwertować poprawnie datę z kwietnia 2004 r. na czas lokalny, trzeba było wiedzieć, jakie było to przesunięcie w stosunku do czasu UTC konkretny punkt w czasie XSLT nie ma tej możliwości i trzeba będzie wykonać konwersję w innej aplikacji, która ma dostęp do Baza danych Olsona.


Dodany:

Wszystko to wymaga XSLT 2.0. Odkąd wyjaśniłeś, że używasz XSLT 1.0:

  1. XSLT 1.0 nie ma możliwości dowiedzenia się, jakie jest aktualne lokalne przesunięcie z UTC - nie mówiąc już o tym, jakie było przesunięcie w danym momencie.
  2. Istnieje sposób na dostosowanie podanej wartości dateTime do innej strefa czasowa - pod warunkiem podania wymaganego przesunięcia jako parametru podczas wywoływania transformacji XSL (lub że offset jest stały).

Oto przykład szablonu, który przekształci UTC na UTC -1: 00 (jako stała):

<xsl:template name="UTC-minus-one">
<xsl:param name="dateTime"/>

<xsl:variable name="date" select="substring-before($dateTime, "T")" />
<xsl:variable name="time" select="substring-before(substring-after($dateTime, "T"), "Z")" />

<xsl:variable name="year" select="substring($date, 1, 4)" />
<xsl:variable name="month" select="substring($date, 6, 2)" />
<xsl:variable name="day" select="substring($date, 9, 2)" />

<xsl:variable name="hour" select="substring($time, 1, 2)" />
<xsl:variable name="minute" select="substring($time, 4, 2)" />
<xsl:variable name="second" select="substring($time, 7)" />

<xsl:variable name="a" select="floor((14 - $month) div 12)"/>
<xsl:variable name="y" select="$year + 4800 - $a"/>
<xsl:variable name="m" select="$month + 12*$a - 3"/>
<xsl:variable name="jd" select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />

<xsl:variable name="total-seconds" select="86400*$jd + 3600*$hour + 60*$minute + $second - 3600" />

<xsl:variable name="new-jd" select="floor($total-seconds div 86400)"/>
<xsl:variable name="new-hour" select="floor($total-seconds mod 86400 div 3600)"/>
<xsl:variable name="new-minute" select="floor($total-seconds mod 3600 div 60)"/>
<xsl:variable name="new-second" select="$total-seconds mod 60"/>

<xsl:variable name="f" select="$new-jd + 1401 + floor((floor((4 * $new-jd + 274277) div 146097) * 3) div 4) - 38"/>
<xsl:variable name="e" select="4*$f + 3"/>
<xsl:variable name="g" select="floor(($e mod 1461) div 4)"/>
<xsl:variable name="h" select="5*$g + 2"/>
<xsl:variable name="D" select="floor(($h mod 153) div 5 ) + 1"/>
<xsl:variable name="M" select="(floor($h div 153) + 2) mod 12 + 1"/>
<xsl:variable name="Y" select="floor($e div 1461) - 4716 + floor((14 - $M) div 12)"/>

<xsl:value-of select="concat($Y, format-number($M, "-00"), format-number($D, "-00"))"/>
<xsl:text>T</xsl:text>
<xsl:value-of select="concat(format-number($new-hour, "00"), format-number($new-minute, ":00"), format-number($new-second, ":00.###"))"/>
<xsl:text>-01:00</xsl:text>
</xsl:template>

Próbny: http://xsltransform.net/bFWR5F8


1 dla odpowiedzi nr 2

Zakładając taki plik testowy XML

<?xml version="1.0"?>
<root>
<val>2004-04-12T13:20:00Z</val>
<val>2004-05-12T23:20:00Z</val>
<val>2004-06-12T00:20:00Z</val>
</root>

Plik XSLT-2.0, taki jak ten, ustawi strefę czasową na -1:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>

<xsl:template match="//val">
<xsl:variable name="t_offset" select="xs:dayTimeDuration("-PT1H")" />     <!-- set timezone to -1 hours -->
<xsl:variable name="time"     select="xs:dateTime(normalize-space(text()))"  />
<xsl:value-of select="$time" />
<xsl:value-of select=""&#10;"" />
<xsl:value-of select="adjust-dateTime-to-timezone($time, $t_offset)" />   <!-- adjust the time to the new timezone -->
<xsl:value-of select=""&#10;"" />
<xsl:value-of select=""------------------&#10;"" />
</xsl:template>

</xsl:stylesheet>

Jego wydajność to:

2004-04-12T13:20:00Z
2004-04-12T12:20:00-01:00
------------------
2004-05-12T23:20:00Z
2004-05-12T22:20:00-01:00
------------------
2004-06-12T00:20:00Z
2004-06-11T23:20:00-01:00
------------------