XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / Zeit ist Geld

Zeit ist Geld

Zeit ist Geld

➪ Die XML-Schema-Datentypen xs:date, xs:time und xs:dateTime haben einen klar definierten Aufbau. Die aktuelle Systemzeit ist ermittelbar durch current-dateTime(), current-date() bzw. current-time(). Wichtig sind noch Spezialfunktionen zur Formatierung. Diese können prozessorbedingt (auch bei unterschiedlichen Versionen desselben Anbieters) beträchtlich abweichen, sodass ein eingehendes Testen der Ergebnisse notwendig erscheint.

Auf dieser Seite:

Zeit ist Geld. Ich bin mir nicht ganz sicher, ob die Behauptung stimmt. Gut betuchte Zeitgenossen sind meistens in Eile, während Menschen mit viel Zeit nur selten auch über viel Geld verfügen.

Perfektioniert wird der Zeitgeiz durch

Wenn auch Sie ein Uhrmensch sind, dann sagen Ihnen die Funktionen zur Zeitkalkulation vielleicht, was die Stunde geschlagen hat.

current-date() 2018-01-14+02:00
current-dateTime() 2018-01-14T18:00:32+02:00
current-time() 18:00:32+02:00

Je nach verwendetem Prozessor sieht das Ergebnis freilich anders aus. Ob die Darstellung der Nanosekunden entscheidend ist, will ich nicht beurteilen; aber die korrekte Darstellung der Sommerzeit wäre schon wünschenswert.

current-date() 2018-01-14+01:00
current-dateTime() 2018-01-14T18:00:32.4182393+01:00
current-time() 18:00:32.4182393+01:00

xs:date

Der XML-Schema-Datentyp xs:date hat einen genau definierten Aufbau:


%Y-%m-%d%z

xs:time

Der XML-Schema-Datentyp xs:time hat einen genau definierten Aufbau:


%H:%M:%S%z

xs:dateTime

Der XML-Schema-Datentyp xs:dateTime hat einen genau definierten Aufbau:


%Y-%m-%dT%H:%M:%S%z

format-dateTime

Interessant dürften die Formatierungsmöglichkeiten für xs:dateTime sein:


<xsl:variable 
     name="vJetzt" 
     select="current-dateTime()" 
     as="xs:dateTime"/>

Nehmen Sie die Formatierung [D1o] [MNn] [Y0001].


<v1>
   <xsl:value-of 
       select="format-dateTime($vJetzt,
     '    [D1o] [MNn] [Y0001]','de','AD','DE')"/>
</v1>

Mit drei unterschiedlichen XSL-Prozessoren getestet, erhalten Sie zum Beispiel dieses Resultat:


<v1>27th Januar 2018</v1>
<v1>27th Januar 2018</v1>
<v1>27. Januar 2018</v1>		

(Hinweis: Nach einem Prozessorwechsel (neuere Version desselben Herstellers) wurde ich bei der Ausgabe "27. Januar 2018" mit der Zusatzinformation über den verwendeten Kalender beglückt, was eine abermalige Umstellung der Codierung notwendig machte, um das bisherige Ergebnis zu erzielen: statt 'de','AD','DE' verwendete ich 'de',null,'DE'.)

[D1] [MNn] [Y0001] sieht im Output dagegen so aus:


<v2>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[D1] [MNn] [Y0001]','de','AD','DE')"/>
</v2>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v2>27 Januar 2018</v2>
<v2>27 Januar 2018</v2>
<v2>27 Januar 2018</v2>

[D1] [MN] [Y0001] können Sie aufrufen mit


<v3>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
         '[D1] [MN] [Y0001]','de','AD','DE')"/>
</v3>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v3>27 JANUAR 2018</v3>
<v3>27 JANUAR 2018</v3>
<v3>27 JANUAR 2018</v3>

Auch der Aufruf von [D1] [Mn] [Y0001] ist möglich:


<v4>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[D1] [Mn] [Y0001]','de','AD','DE')"/>
</v4>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v4>27 januar 2018</v4>
<v4>27 januar 2018</v4>
<v4>27 januar 2018</v4>

Langsam macht's Spaß: [D1] [M] [Y01]


<v5>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[D1] [M] [Y01]','de','AD','DE')"/>
</v5>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v5>27 1 18</v5>
<v5>27 1 18</v5>
<v5>27 1 18</v5>

Etwas detaillierter wird's mit

KW [W]: [D1o] [MNn] [Y0001], [H01]:[m01]:[s01] [Z] [C]


<v6>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          'KW [W]: [D1o] [MNn] [Y0001], 
          [H01]:[m01]:[s01] [Z] [C]',
          'de','AD','DE')"/>
</v6>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v6>KW 4: 27th Januar 2018, 18:21:13 +01:00 ad</v6>
<v6>KW 4: 27th Januar 2018, 18:21:13 +02:00 </v6>
<v6>KW 4: 27. Januar 2018, 18:21:13 +02:00 Gregorianisch</v6>

Vormittags oder nachmittags, das ist hier die Frage:

[D1o] [MNn] [Y0001] [h01] [P]


<v7>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[D1o] [MNn] [Y0001] [h01] [P] ',
          'de','AD','DE')"/>
</v7>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v7>27th Januar 2018 06 p.m. </v7>
<v7>27th Januar 2018 06 p.m. </v7>
<v7>27. Januar 2018 06 p.m. </v7>

[Di] [Mn] [YIIII] ist nicht nur für Römer:


<v8>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[Di] [Mn] [YIIII]','de','AD','DE')"/>
</v8>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finde ich dieses Resultat:


<v8>xxvii januar 2018</v8>
<v8>xxvii januar MMXVIII</v8>
<v8>xxvii januar MMXVIII</v8>

Sie möchten wissen, wie man das Datum ausspricht? Kein Problem mit

[Dw] [MW] [YWWWW]


<v9>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[Dw] [MW] [YWWWW]','de','AD','DE')"/>
</v9>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v9>twentyseven ONE 2018</v9>
<v9>twentyseven ONE TWO THOUSAND AND EIGHTEEN</v9>
<v9>siebenundzwanzig EINS Zweitausend Achtzehn</v9>

Dasselbe in Grün, nur nicht ganz so laut? Bitte sehr:

[Dw] [Mw] [YWwww]


<v10>
   <xsl:value-of 
        select="format-dateTime($vJetzt,
          '[Dw] [Mw] [YWwww]','de','AD','DE')"/>
</v10>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v10>twentyseven one 2018</v10>
<v10>twentyseven one two thousand and eighteen</v10>
<v10>siebenundzwanzig eins zweitausend achtzehn</v10>

implicit-timezone()

Die implizite Zeitzone erhalten Sie mit der Funktion implicit-timezone()


<xsl:value-of select="implicit-timezone()"/>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


PT1H
PT2H
PT2H

adjust-date-to-timezone

fn:adjust-date-to-timezone fügt einem xs:date noch die Zeitzone hinzu, die sich aus dem Kontext ergibt. Die Funktion benötigt zu diesem Zweck einen Parameter vom Typ xs:date, der sich durch XML-Schema typsauber herstellen lässt.


<xsl:value-of 
     select="fn:adjust-date-to-timezone(
               xs:date('2018-01-08'))"/>

Das Ergebnis lautet in diesem Fall:


<root>2018-01-08+02:00</root>

In demselben Sinn arbeiten auch die Funktionen fn:adjust-dateTime-to-timezone ...


<xsl:value-of 
     select="fn:adjust-dateTime-to-timezone(
                xs:dateTime('2018-01-08T15:20:07'))"/>	

... das Ergebnis lautet dann:


<root>2018-01-08T15:20:07+02:00</root>

... sowie fn:adjust-time-to-timezone.


<xsl:value-of 
     select="fn:adjust-time-to-timezone(
                xs:time('15:22:12'))"/>

Das Ergebnis lautet zu diesem Zeitpunkt:


<root>15:22:12+02:00</root>

Duration: Rechnen mit der Zeit

Etwas komplexer wird es bei der Zeitrechnung mit DateTime und Duration (also Dauer). Wenn Sie wissen möchten, welche Zeit sich (gemessen am aktuellen Zeitstempel) nach Ablauf von 1 Jahr, 2 Monaten, 15 Tagen, 38 Stunden und 19 Minuten ergibt, so gehen Sie wie folgt vor:


<v11><xsl:value-of 
   select="current-dateTime() 
           + xs:yearMonthDuration('P1Y2M') 
           + xs:dayTimeDuration('P15DT38H19M')" /></v11>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v11>2018-12-05T10:55:16.0619506+01:00</v11>
<v11>2018-12-05T10:55:16.06+02:00</v11>
<v11>2018-12-05T10:55:16+02:00</v11>

Wenn Sie wissen möchten, welches Datum vor dem 01.01.2019 liegt (nur für den Fall, dass Sie Ihre Silvesterparty perfekt planen wollen), so ist auch dieser Aufruf möglich:


<v12><xsl:value-of 
  select="xs:date('2019-01-01') 
          - xs:dayTimeDuration('P1D')" /></v12>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v12>2018-12-31</v12>
<v12>2018-12-31</v12>
<v12>2018-12-31</v12>

Auch der nächste Schalttag wird korrekt berechnet:


<v13><xsl:value-of 
  select="xs:date('2020-03-01') 
          - xs:dayTimeDuration('P1D')" /></v13>

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden Sie dieses Resultat:


<v13>2020-02-29</v13>
<v13>2020-02-29</v13>
<v13>2020-02-29</v13>

wg / 22. September 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/Zeitfunktionen.html