Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


Zeit ist Geld

Zusammenfassung:

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

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() 2017-10-14+02:00
current-dateTime() 2017-10-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() 2017-10-14+01:00
current-dateTime() 2017-10-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>14th Oktober 2017</v1>
<v1>14th Oktober 2017</v1>
<v1>14. Oktober 2017</v1>		

(Hinweis: nach einem Prozessorwechsel - neuere Version desselben Herstellers - wurde ich bei der Ausgabe "18. Oktober 2017" 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>14 Oktober 2017</v2>
<v2>14 Oktober 2017</v2>
<v2>14 Oktober 2017</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>14 OKTOBER 2017</v3>
<v3>14 OKTOBER 2017</v3>
<v3>14 OKTOBER 2017</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>14 oktober 2017</v4>
<v4>14 oktober 2017</v4>
<v4>14 oktober 2017</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>14 9 17</v5>
<v5>14 9 17</v5>
<v5>14 9 17</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 41: 14th Oktober 2017, 18:21:13 +01:00 ad</v6>
<v6>KW 41: 14th Oktober 2017, 18:21:13 +02:00 </v6>
<v6>KW 41: 14. Oktober 2017, 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>14th Oktober 2017 06 p.m. </v7>
<v7>14th Oktober 2017 06 p.m. </v7>
<v7>14. Oktober 2017 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>xiv oktober 2017</v8>
<v8>xiv oktober MMXVII</v8>
<v8>xiv oktober MMXVII</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>fourteen TEN 2017</v9>
<v9>fourteen TEN TWO THOUSAND AND SEVENTEEN</v9>
<v9>vierzehn ZEHN Zweitausend Siebzehn</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>fourteen ten 2017</v10>
<v10>fourteen ten two thousand and seventeen</v10>
<v10>vierzehn zehn Zweitausend Siebzehn</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('2017-10-08'))"/>

Das Ergebnis lautet in diesem Fall:

<root>2017-10-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('2017-10-08T15:20:07'))"/>	

... das Ergebnis lautet dann:

<root>2017-10-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>

qrpic/Zeitfunktionen.jpg

wg / 14. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


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

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