Konzept Datum & Zeit
Java Bibliothek / IT-System
| Name | Art | Version |
|---|---|---|
|
Bibliothek |
5.x |
Diese Seite beschreibt die konzeptionellen Grundlagen der Verarbeitung von Datums- und Zeitwerten in der IsyFact. Sie definiert Vorgaben fĂĽr die einheitliche Verwendung von Datums- und Zeitfunktionen sowie die Behandlung von Datums- und Zeitwerten in Anwendungen und bildet so die Grundlage einer technisch und fachlich einheitlichen Umsetzung.
Die aus diesem Konzept abgeleitete Umsetzung der Verarbeitung von Datums- und Zeitwerten im Rahmen der Anwendungsentwicklung ist in den Nutzungsvorgaben Datum & Zeit beschrieben.
Der Baustein Datum & Zeit bedient sich Projekterfahrungen sowie Best Practices und setzt auf die Datums- und Zeitfunktionen des JSR 310 ("Date and Time API").
| JSR 310: Date and Time API |
Zunächst werden die Anforderungen an die Verarbeitung von Datums- und Zeitwerten definiert, welche die Grundlage für das nachfolgende Kapitel bilden.
Anschließend werden die Vorgaben zur Verwendung von Datums- und Zeitwerten innerhalb der Anwendungen sowie zur Umsetzung in der zu diesem Baustein gehörenden Bibliothek definiert.
1. Anforderungen
Im Folgenden werden die Anforderungen an die Verarbeitung von Datums- und Zeitwerten definiert. Diese bilden die Grundlage fĂĽr die Vorgaben im darauffolgenden Kapitel.
1.1. Definitionen
Die folgenden Begriffe sind zentral fĂĽr den Baustein "Datum und Zeit" und werden hier definiert.
1.1.1. Datumswert
Datumswerte sind Daten, in denen Angaben zu einem kalendarischen Datum enthalten sind. Typische Bestandteile eines kalendarischen Datums sind Angaben zu Jahr, Monat und Tag. Datumswerte können Zeitwerte enthalten, müssen aber nicht.
Beispiele:
-
17. Juli 2017 (reiner Datumswert)
-
9. Juli 2017 14:50 MESZ (Datumswert mit Zeitwert)
1.1.2. Zeitwert
Zeitwerte sind Daten, in denen Angaben zu einem Zeitpunkt enthalten sind. Typische Bestandteile eines Zeitpunkts sind Angaben zu Stunde, Minute, Sekunden und Zeitzone. Zeitwerte können Teil von Datumswerten sein, aber selbst keine Datumswerte enthalten.
Beispiele:
-
05:04:23.233 GMT (Zeitwert mit Zeitzone)
-
14:50 (Zeitwert, bestehend nur aus Stunde und Minute)
1.1.3. Dauer
Eine Dauer ist eine quantifizierte Menge einer Zeiteinheit (z.B. 37 Sekunden, 14 Tage, 3 Jahre). Sie beschreibt eine zeitliche Länge unabhängig konkreter zeitlicher Angaben (z.B. Länge eines Spielfilms). In Verbindung mit einer Datums- oder Zeitangabe wird sie genutzt, um einen Zeitraum zu definieren (z.B. die Ausstrahlung des Spielfilms startet um 20:15 Uhr und endet um 21:50 Uhr).
Für die Zeiteinheiten gelten folgende Abkürzungen, welche für Ein- und Ausgabe benutzt werden können:
| AbkĂĽrzung | Zeiteinheit |
|---|---|
ms |
Millisekunde |
s |
Sekunde |
min |
Minute |
h |
Stunde |
d |
Tag |
a |
Jahr |
1.2. Darstellung
Die Bibliothek muss Datums- und Zeitwerte für die Anzeige auf grafischen Oberflächen in das in Deutschland gängige Format umwandeln können. Die Bibliothek muss mindestens die folgenden Darstellungen beherrschen (Bestandteile in Klammern sind optional):
-
(Montag,) 17. Juli 2017 14:35:19 (MESZ)
-
17.07.2017 14:35:19 (+02:00)
-
17.07.2017
-
14:35:19
Darüber hinaus muss die Bibliothek so flexibel sein, dass Abweichungen von den Standardformaten in den Anwendungen umgesetzt werden können.
Für die Verwendung an Schnittstellen muss die Bibliothek Datums- und Zeitwerte in eine ISO 8601-konforme Darstellung umwandeln können. Dazu muss standardmäßig folgendes Format benutzt werden:
|
Die Angabe der Zeitzone kann nur dann entfallen, wenn sie global festgelegt wurde oder aus dem Kontext heraus eindeutig hergeleitet werden kann.
1.3. Eingabe
Die Bibliothek muss Eingaben von Datums- und Zeitwerten über Schnittstellen aus einer ISO 8601-konformen Darstellung einlesen können.
Eingaben über grafische Oberflächen muss die Bibliothek aus den in Deutschland gängigen Formaten in einen entsprechenden Datums- oder Zeitwert umwandeln können. Die unterstützten Formate werden in den folgenden Abschnitten definiert.
1.3.1. Datumswert
Eingaben von Datumswerten mĂĽssen Zeichenketten in folgendem Format sein:
<Tag>.<Monat>.<Jahr> <Zeitwert> |
| Feld | Format | Beispiel | Pflichtfeld |
|---|---|---|---|
Tag |
Ganzzahl (1-31) |
3, 03, 14 |
Ja |
Monat |
Ganzzahl (1-12) |
5, 07, 11 |
Ja |
Jahr |
Ganzzahl (1-9999) |
9, 476, 2013 |
Ja |
Zeitwert |
s. Kapitel Zeitwert |
Nein |
|
Anders als in der Anzeige sind keine textuellen Formate für z.B. Wochentage ("Montag") oder Monate ("Dezember") erlaubt. Das Jahr wird immer vollständig interpretiert und darf nicht verkürzt eingegeben werden (z.B. "69" für "1969"). Anwendungen können eine solche Logik vorsehen, müssen die Jahreszahlen allerdings immer vollständig an den Baustein übergeben.
1.3.2. Zeitwert
Eingaben von Zeitwerten mĂĽssen Zeichenketten in folgendem Format sein:
<Stunde>:<Minute>:<Sekunde>.<Sekundenbruchteile> <Zeitzone> |
| Feld | Format | Beispiel | Pflichtfeld |
|---|---|---|---|
Stunde |
Ganzzahl (0-23) |
0, 5, 08, 23 |
Ja |
Minute |
Ganzzahl (00-59) |
00, 04, 23, 59 |
Ja |
Sekunde |
Ganzzahl (00-59) |
00, 08, 44, 59 |
Nein |
Sekunden-bruchteile |
max.
neunstellige Ganzzahl |
127 (ms), |
Nein |
Zeitzone |
Abweichung von UTC oder |
+02:30, -05:00 |
Nein |
Alle Angaben außer Stunden müssen vollständig sein und bei Bedarf mit einer vorangestellten Null versehen werden. Bei Sekundenbruchteilen reichen üblicherweise drei Nachkommastellen, was einer Genauigkeit im Millisekundenbereich entspricht.
1.3.3. Dauer
Eingaben einer Dauer mĂĽssen Zeichenketten in folgendem Format sein:
<Anzahl><Zeiteinheit> (<Anzahl><Zeiteinheit> …) |
| Feld | Format |
|---|---|
Anzahl |
Ganzzahl |
Zeiteinheit |
AbkĂĽrzung der Zeiteinheit (s. Tabelle AbkĂĽrzungen fĂĽr Zeiteinheiten) |
Eine Dauer muss mindestens eine Zeiteinheit beinhalten ("37s"), kann aber auch aus mehreren bestehen ("1h 28min"). Die Zeiteinheiten müssen von der gröbsten Einheit (Jahr) zur feinsten (Millisekunde) hin sortiert sein.
1.3.4. Zeitraum
Zeiträume sind kein eigener Datentyp, sondern werden durch zwei Werte beschrieben. So gibt es zwei Möglichkeiten, einen Zeitraum darzustellen. Entweder
-
Ein Anfang und ein Ende beschrieben durch zwei Datums- oder Zeitwerte oder
-
Ein Anfang beschrieben durch einen Datums- oder Zeitwert sowie eine Dauer.
Die Bibliothek muss zur Eingabe eines Zeitraums diese Kombinationen von Werten unterstützen, deren Format gemäß der Anforderungen der Kapitel Datumswert bis Dauer beschaffen sein muss. Die folgende Tabelle zeigt Beispiele für die Eingabewerte von Zeiträumen.
| 1. Wert | 2. Wert | Beispiel |
|---|---|---|
Datumswert |
Datumswert |
12.7.2017 14:00, 13.09.2018 19:00 |
Datumswert |
Dauer |
12.8.2013, 14 d |
Zeitwert |
Zeitwert |
13:40:00, 15:45:12 |
Zeitwert |
Dauer |
12:00, 90min 15s |
1.4. Berechnungen
Die Bibliothek muss bestimmte Berechnungen auf Datumswerten, Zeitwerten und Zeiträumen bereitstellen.
1.4.1. Datums- & Zeitwert
Die Bibliothek muss die folgenden Berechnungen auf Datums- & Zeitwerten ermöglichen:
-
Chronologische Sortierung einer Menge von Datums- und Zeitwerten
-
Chronologische Vergleiche zwischen Datums- und Zeitwerten
("früher als", "später als", "gleichzeitig") -
Ermittlung des "Tagesdatums" (der zeitliche Anteil eines Datumswerts wird auf 0, d.h. auf Mitternacht, gestellt)
-
Berechnung des Abstands ("Dauer") zwischen zwei Datums- oder Zeitwerten
-
Addition und Subtraktion von Datums- und Zeitwerten mit einer Dauer
-
PrĂĽfung, ob zwei Datumswerte fĂĽr zwei direkt aufeinanderfolgende Tage stehen ("Liegt der 28.2.2016 direkt vor dem 1.3.2016?")
-
Berechnung des nächsten Werktags nach einem übergebenen Datumswert
1.5. Ungewisse Datumswerte
Die Bibliothek muss sogenannte ungewisse Datumswerte verarbeiten können. Dabei sind Teile eines Datumswerts zunächst ungewiss. Die Bibliothek muss die Möglichkeit vorsehen, solche ungewissen Angaben später zu konkretisieren.
| Erkenntnisse | Wert |
|---|---|
Initiale Erkenntnis: Vom Geburtsdatum einer Person ist nur das Jahr bekannt |
Geburtsdatum: |
Zusätzliche Erkenntnis: Die Person ist im Juni des Jahres geboren. Der Tag ist zweistellig. |
Geburtsdatum: |
Zusätzliche Erkenntnis: Die Person ist am 24. geboren. |
Geburtsdatum: |
Konkretisierung eines ungewissen Datums zeigt einen beispielhaften Verlauf einer Konkretisierung eines Datumswerts: Das Datum ist zunächst ungewiss, wird durch spätere Erkenntnisse aber schlussendlich zu einem Datum ohne Ungewissheit konkretisiert. Es gibt eine Einschränkung bei der Konkretisierung ungewisser Datumswerte. Da die Ungewissheit durch Zeiträume abgebildet wird, müssen ungewisse Datumswerte immer einen in sich abgeschlossenen Zeitraum bilden. Nicht abbildbar ist z.B. "Geburtsdatum: der 24. eines beliebigen Monats des Jahres 1976", da dies nicht als Zeitraum darstellbar ist.
2. Vorgaben
Die folgenden architektonischen und technischen Vorgaben beziehen sich auf die Umsetzung der in Kapitel Anforderungen genannten Anforderungen in der zu diesem Baustein gehörenden Bibliothek.
2.1. Namenskonventionen
Die Bibliothek besitzt die folgenden Maven-Koordinaten:
-
Group-ID:
de.bund.bva.isyfact -
Artifact-ID:
isy-datetime
Das Stammpackage fĂĽr alle Klassen der Umsetzung setzt sich aus Group-ID und Artifact-ID zusammen und lautet: de.bund.bva.isyfact.datetime.
2.2. Bedeutung der Standardbibliothek
Die Bibliothek muss zur Umsetzung der Anforderungen so stark wie möglich auf die im JSR 310 beschriebene API setzen. Falls einige der Anforderungen aus dem Kapitel Anforderungen komplett durch die Funktionalität dieser API abgedeckt sind, wird in den Nutzungsvorgaben die entsprechende Verwendung der API mit Verweis auf die Standarddokumentation knapp erläutert. Abweichungen von der API oder eigene Implementierungen bereits vorhandener Funktionalität müssen in den Nutzungsvorgaben begründet und beschrieben werden.
2.3. Verwendung der Standardbibliothek
Innerhalb von Anwendungen können alle Typen des "JSR 310: Date and Time API" verwendet werden, insofern dieses Konzept an anderer Stelle die Nutzung nicht weiter einschränkt.
Die Bibliothek muss sicherstellen, dass die gesamte Funktionalität für alle geeigneten Typen angeboten wird und an geeigneten Stellen sinnvolle Umwandlungen (d.h. ohne Verlust von Daten oder Genauigkeit) möglich sind.
2.4. Darstellung & Eingabe
Die Bibliothek wird zur Umsetzung der Darstellung sowie Eingabe keine konkrete Technologie zur Erstellung
grafischer Oberflächen unterstützen.
Stattdessen muss sie die Funktionalität auf Basis der Standardbibliothek bereitstellen, damit sie leicht von
GUI-Technologien verwendet werden kann.
Zum Ausgeben von Werten und Einlesen von Eingaben muss die Bibliothek die Klasse java.time.format.DateTimeFormatter
verwenden und, falls nötig, auf die in Deutschland gängigen Formate hin konfigurieren oder Funktionen anbieten, um
gängige Formate leicht ausgeben und einlesen zu können.
Eine Reihe von Standardformaten, welche die Bibliothek unterstĂĽtzen muss, sind im Kapitel Darstellung beschrieben.
2.5. Ungewisse Datumwerte
Die Bibliothek muss zur Behandlung ungewisser Datumswerte die folgende Funktionalität bereitstellen:
-
Definition der Datenobjekte zur Verwendung ungewisser Datumswerte im Anwendungskern
-
Definition der Transportobjekte zur Ăśbermittlung ungewisser Datumswerte ĂĽber Schnittstellen
-
Formatierung ungewisser Daten zur Anzeige
-
Einlesen ungewisser Daten nach Eingabe durch Anwender
Bisherige Implementierungen ungewisser Datumswerte setzen immer den Sonderfall um, bei dem entweder der Tag, Tag und Monat oder alle Teile eines Datumswerts unbekannt sind. Die Anzeige und Eingabe dieser unbekannten Werte erfolgt hierbei ĂĽber Nullen, wie die Bisherige Umsetzung ungewisser Datumswerte zeigt.
| Sonderfall | Eingabe / Darstellung | Intern |
|---|---|---|
Tag unbekannt |
00.05.1966 |
Zeichenkette: "00.05.1966" |
Tag und Monat unbekannt |
00.00.1966 |
Zeichenkette: "00.00.1966" |
Datum komplett unbekannt |
00.00.0000 |
Zeichenkette: "00.00.0000" |
Der Hauptnachteil dieser Umsetzung besteht darin, dass die Datumswerte durch ihre interne Darstellung als Zeichenkette nur mit großem Aufwand mit anderen Datumswerten verglichen bzw. in Berechnungen verwendet werden können. Trotzdem muss die Bibliothek ungewisse Datumswerte dieser Art einlesen und ausgeben können. Die Werte werden beim Einlesen intern in entsprechende Zeiträume umgewandelt und bei der Darstellung wieder in die ursprüngliche Form überführt. Eine Übersicht dieses Vorgangs zeigt die Umsetzung der Sonderfälle (mit Nullen).
| Sonderfall | Eingabe / Darstellung | Intern |
|---|---|---|
Tag unbekannt |
00.05.1966 |
Zeitraum: 1.5.1966 – 31.5.1966 |
Tag und Monat unbekannt |
00.00.1966 |
Zeitraum: 1.1.1966 – 31.12.1966 |
Datum komplett unbekannt |
00.00.0000 |
Zeitraum: nicht gesetzt (null) |
Des Weiteren muss die Bibliothek die Eingabe unbekannter Datumsbestandteile mittels "x" unterstützen. Diese Möglichkeit wird die Eingabe unbekannter Datumsbestandteile mittels Nullen mittelfristig ablösen und unterstützt Eingaben im ISO-8601 Datumsformat. Eine Übersicht der so umgesetzten Spezialfälle zeigt die Umsetzung der Sonderfälle (mit "x").
| Sonderfall | Eingabe / Darstellung | Intern |
|---|---|---|
Tag unbekannt |
xx.05.1966 |
Zeitraum: |
Tag und Monat unbekannt |
xx.xx.1966 |
Zeitraum: |
Datum komplett unbekannt |
xx.xx.xxxx |
Zeitraum: |
Tag unbekannt (ISO-8601) |
1966-05-xx |
Zeitraum: |
Tag und Monat unbekannt (ISO-8601) |
1966-xx-xx |
Zeitraum: |
Datum komplett unbekannt (ISO-8601) |
xxxx-xx-xx |
Zeitraum: |
2.6. TestunterstĂĽtzung
Die Umsetzung der TestunterstĂĽtzung geschieht ĂĽber das Mocken der Klasse java.time.Clock.
Dazu muss die Bibliothek bei der Erzeugung von Datums- und Zeitangaben die Varianten mit einer Clock als Parameter
benutzen und in der Konfiguration eine Clock als Abhängigkeit definieren.
Des Weiteren müssen sich auch Anwendungen an diese Vorgabe halten, um die Testunterstützung nutzen zu können.
Insbesondere sind Aufrufe von System.currentTimeMillis() sowie der Varianten von now() auf Typen der Datums- und
Zeittypen ohne Verwendung einer Clock bei Nutzung dieses Bausteins verboten!