2016-07-13 26 views
1

i bin neu in XSLTXSLT: Vergleich Datum Zeitzone

Wie die Datumszeichenketten in XSLT und geben das Ergebnis

unten vergleichen ist mein Eingang xml

<?xml version="1.0" encoding="UTF-8"?> 
<dates> 
    <date1>2003-09-15T16:53:22.000-07:00</date1> 
    <date2>2003-09-15T16:53:23.000-07:00</date2> 
</dates> 

unter meinem XSLT ist

jetzt in XSLT ich möchte die oben genannten Daten vergleichen, so ist es möglich in XSLT 1.0 zu vergleichen (groß er, kleiner, gleich) die Daten

ich glaube an xslt 1.0 ist es nicht möglich, wenn möglich teilen Sie bitte die Informationen.

wenn es in XSLT 2.0 bitte helfen Sie mir geschieht, wie ich dieses Problem beheben kann,

in meinem aktuellen laufenden Studie Projekt, habe ich verwendet, XSLT 1.0, also bitte Antwort in XSLT 1.0 Dank vorschlagen

+0

Es kann in XSLT 1.0 sowie in XSLT 2.0 erfolgen. In XSLT 2.0 ist es natürlich viel einfacher. Bitte wählen Sie die Version, für die Sie die Antwort wünschen. –

+0

@ michael.hor257k Frage bearbeitet. bitte helft mir – user2587669

+0

Wenn verfügbar, kann dies einfach mit der [EXSLT-Funktion 'date: seconds'] (http://exslt.org/date/functions/seconds/index.html) durchgeführt werden. – nwellnhof

Antwort

2

Um dies in XSLT 1.0 zu tun, müssen Sie zunächst die angegebenen dateTimes in numerische Werte konvertieren und sie an eine gemeinsame Zeitzone angleichen.

Im folgenden Sheet jede Datums- und Uhrzeit auf die Anzahl der Sekunden seit dem Mittag UTC vom 24. November abgelaufen umgewandelt wird 4714 BC - siehe: https://en.wikipedia.org/wiki/Julian_day

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="dates"> 
    <xsl:variable name="date1"> 
     <xsl:call-template name="dateTime-to-seconds"> 
      <xsl:with-param name="dateTime" select="date1" /> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:variable name="date2"> 
     <xsl:call-template name="dateTime-to-seconds"> 
      <xsl:with-param name="dateTime" select="date2" /> 
     </xsl:call-template> 
    </xsl:variable> 
    <result> 
     <xsl:choose> 
      <xsl:when test="$date1 &lt; $date2">date1 occurs earlier than date2</xsl:when> 
      <xsl:when test="$date1 = $date2">the two dates are concurrent</xsl:when> 
      <xsl:when test="$date1 &gt; $date2">date1 occurs later than date2</xsl:when> 
     </xsl:choose> 
    </result> 
</xsl:template> 

<xsl:template name="dateTime-to-seconds"> 
    <xsl:param name="dateTime"/> 

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

    <xsl:variable name="local-time" select="substring($time, 1, string-length($time) - 6)" /> 
    <xsl:variable name="offset" select="substring-after($time, $local-time)" /> 

    <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($local-time, 1, 2)" /> 
    <xsl:variable name="minute" select="substring($local-time, 4, 2)" /> 
    <xsl:variable name="second" select="substring($local-time, 7)" /> 

    <xsl:variable name="offset-sign" select="1 - 2 * starts-with($offset, '-')" /> 
    <xsl:variable name="offset-hour" select="substring($offset, 2, 2) * $offset-sign" /> 
    <xsl:variable name="offset-minute" select="substring($offset, 5, 2) * $offset-sign" /> 

    <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:value-of select="86400*$jd + 3600*$hour + 60*$minute + $second - 3600*$offset-hour - 60*$offset-minute" /> 
</xsl:template> 

</xsl:stylesheet> 

auf dem angewandten folgende Testeingang:

XML

<dates> 
    <date1>2003-09-15T16:53:22.000-07:00</date1> 
    <date2>2003-09-15T17:53:22.000-06:00</date2> 
</dates> 

das Ergebnis wird sein:

<?xml version="1.0" encoding="UTF-8"?> 
<result>the two dates are concurrent</result> 
+0

sehr glücklich für die Lösung, wie ich sehen kann, dass Sie 365 Tage in einem Jahr betrachtet haben. Ich habe Frage funktioniert das auch im Schaltjahr (366 Tage) und bei Tageslicht sparen.? – user2587669

+0

"* Ich kann sehen, dass Sie 365 Tage in einem Jahr betrachtet haben *" Sie sollten sich den gesamten Ausdruck '365 * $ y + Boden ($ y div 4) - Boden ($ y div 100) + Boden ($ y div 400) '. Das ist für Schaltjahre verantwortlich. - Was das Speichern von Tageslicht angeht, ist es hier irrelevant: dateTime enthält einen Offset von UTC; Wenn die Tageslichtsicherung wirksam ist, wird der Offset dies widerspiegeln. –

+0

Kudos zur Erklärung – user2587669