Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XPath / 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() 2020-01-12+01:00
current-dateTime() 2020-01-12T10:54:01.821+01: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() 2020-01-12T10:54:30.649+01:00
current-time() 10:54:30.649+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 ebenso genau definierten Aufbau:


%H:%M:%S%z

xs:dateTime

Der XML-Schema-Datentyp xs:dateTime hat gleichfalls 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>12th Januar 2020</v1>
<v1>12th Januar 2020</v1>
<v1>12. Januar 2020</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>12 Januar 2020</v2>
<v2>12 Januar 2020</v2>
<v2>12 Januar 2020</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>12 JANUAR 2020</v3>
<v3>12 JANUAR 2020</v3>
<v3>12 JANUAR 2020</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>12 januar 2020</v4>
<v4>12 januar 2020</v4>
<v4>12 januar 2020</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>12 1 20</v5>
<v5>12 1 20</v5>
<v5>12 1 20</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>

Je nach verwendetem XSL-Prozessor finden Sie dieses Resultat (bei anderen Prozessoren können die Ergebnisse variieren, das gilt auch für die folgenden Beispiele):


<v6>KW 2: 12. Januar 2020,  12:50:38 +01:00 Gregorianisch</v6>

Beim Aufruf von format-dateTime(current-dateTime(), 'KW [W]: [D1o] [MNn] [Y0001], [H01]:[m01]:[s01] [Z] [C]', 'de','AD','DE') in XQuery (Basex) erhalte ich dagegen diese Formatiereung:


[Place: ]KW 2: 12e Januar 2020, 12:50:38 +01:00 n. chr

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>

Je nach verwendetem XSL-Prozessor finden Sie dieses Resultat:


<v7>12. Januar 2020 12 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>

Je nach verwendetem XSL-Prozessor finden Sie dieses Resultat:


<v8>xii januar MMXX</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>

Das prozessorabhängige Resultat:


<v9>zwölf EINS Zweitausend Zwanzig</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>

Das prozessorabhängige Resultat:


<v10>zwölf eins Zweitausend Zwanzig</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 (Winterzeit)
PT2H (Sommerzeit)

adjust-date-to-timezone

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="adjust-date-to-timezone(
                xs:date('2020-01-31'))"/>

Das Ergebnis lautet in diesem Fall:


<root>2020-01-31+01:00</root>

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


<xsl:value-of select="adjust-dateTime-to-timezone(
                xs:dateTime('2020-01-31T15:21:00'))"/>	

... das Ergebnis lautet dann:


<root>>2020-01-31T15:21:00+01:00</root>

... sowie adjust-time-to-timezone.


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

Das Ergebnis lautet zu diesem Zeitpunkt:


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

Bitte prüfen Sie jeweils, ob die Timezone korrekt angegeben ist (Sommerzeit / Winterzeit).

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>

Das prozessorabhängige Resultat:


<v11>2021-03-29T03:23:34.914+01:00</v11>

Wenn Sie wissen möchten, welches Datum vor dem 01.01.2021 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('2021-01-01') 
          - xs:dayTimeDuration('P1D')" /></v12>

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


<v12>2020-12-31</v12>
<v12>2020-12-31</v12>
<v12>2020-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>

Alternative Lösung in XPath 3.0 / XQuery

über =>:


current-dateTime() 
   => format-dateTime('KW [W]: [D1o] [MNn] [Y0001], 
          [H01]:[m01]:[s01] [Z] [C]', 'de','AD','DE')

auch hier können Sie mit xs:dayTimeDuration rechnen


(current-dateTime() + xs:dayTimeDuration('P15DT38H19M'))
 => format-dateTime('KW [W]: [D1o] [MNn] [Y0001], 
          [H01]:[m01]:[s01] [Z] [C]', 'de','AD','DE')

wg / 22. März 2020



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