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, so daß ein eingehendes Testen der Ergebnisse notwendig erscheint.

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 sind, 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, also

xs:time

Der XML Schema - Datentyp xs:time hat einen genau definierten Aufbau: %H:%M:%S%z, also

xs:dateTime

Der XML Schema - Datentyp xs:dateTime hat einen genau definierten Aufbau: %Y-%m-%dT%H:%M:%S%z, also

format-dateTime

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


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

So bringt die Formatierung [D1o] [MNn] [Y0001] folgendes Ergebnis:


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

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden wir 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 Kodierung 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 wir dieses Resultat:


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

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


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

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden wir 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 wir dieses Resultat:


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

Langsam machts 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 wir 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 wir 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 wir 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, finden wir 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 wir 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 wir 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 wir mit der Funktion implicit-timezone()


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

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden wir 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 entsprechenden XML-Schema-typsauber herstellen läßt.


<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 Durations (also Dauer). Wenn wir 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 wir wie folgt vor:


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

Mit drei unterschiedlichen XSL-Prozessoren getestet, finden wir 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 wir wissen möchten, welches Datum vor dem 01.01.2018 liegt (nur für den Fall, daß Sie Ihre Silvesterparty planen wollen), so ist auch dieser Aufruf möglich:


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

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


<v12>2017-12-31</v12>
<v12>2017-12-31</v12>
<v12>2017-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 wir dieses Resultat:


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

wg / 17. Februar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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