BS2000 erweitert das TODR um so genannte TODR-Epochen. Damit kann eine Systemzeit bis 18.3.4317 02:44:48.587775 Uhr dargestellt werden.
Die TODR-Epoche für den aktuellen Systemlauf wird im Startup-Parameterservice, Parametersatz GTIME, Parameter EPOCH eingestellt, siehe Abschnitt „Steuerung der Systemzeit (GTIME)". Sie kann während des Systemlaufs nicht verändert werden.
Der Parameter EPOCH (auch als „Epoch Designator“ bezeichnet) wird in den Benutzer-Makros CTIME (Rechnen mit Zeitstempeln) und GTIME (Datum und Uhrzeit anfordern) automatisch berücksichtigt, siehe Handbuch „Makroaufrufe an den Ablaufteil [30]. GTIME (und auch das Kommando SHOW-SYSTEM-INFORMATION) liefern den aktuellen EPOCH-Wert als Rückkehrinformation. Programme, die selbst mit dem TODR rechnen, können den im Abschnitt „Rechnen mit TODR-Epochen" beschriebenen Algorithmus verwenden.
Der Parameter EPOCH besteht aus zwei Sedezimalziffern <epc><epo>:
die erste Sedezimalziffer (<epc>, „Epoch Counter“) bezeichnet aufsteigend eine der disjunkten Haupt-Epochen des TODR
die zweite Sedezimalziffer (<epo>, „Epoch Offset“) beschreibt aufsteigend eine TODR-Epoche, die in der durch <epc> bestimmten Haupt-Epoche beginnt und in die nachfolgende Haupt-Epoche hineinreicht, also die Haupt-Epochen überlappt
EPOCH=00 bezeichnet die Standard-Epoche, d.h. den Zeitraum von 1.1.1900 00:00:00 Uhr bis 17.9.2042 23:53:47.370495 Uhr
Bild 30: TODR-Epochen
Auf diese Weise ist für ein System ein gleitender Übergang zwischen den Epochen möglich, siehe das folgende Beispiel.
Beispiel
Bisher gelte die Standard-Epoche (bis 17.9.2042 23:53:47.370495 Uhr), also EPOCH=00.
Nun sei das aktuelle Tagesdatum der 2.1.2030 und die Systembetreuung sehe die Notwendigkeit, das System auf den Ablauf der Standard-Epoche am 17.9.2042 vorzubereiten.
Dies könnte z.B. mit der Einstellung EPOCH=08 geschehen. Damit wird für das TODR der Zeitraum vom 11.5.1971 11:56:53.685248 Uhr bis 26.1.2114 11:50:41.055743 eingestellt, siehe nachfolgende Tabelle. Zeitstempel vor dem 11.5.1971 11:56:53.685248 Uhr können dann nicht mehr ohne Umrechnung mit dem aktuellen TODR verglichen werden.
Theoretisch könnten bei Umstellung am 2.1.2030 die Werte EPOCH=01 bis EPOCH=0E verwendet werden. Niedrige EPOCH-Werte legen aber eine Epoche fest, die die bisherige Epoche um nur wenige Jahre überschreitet. Bei hohen Epoch-Werten besteht die Gefahr, dass Zeitstempel, die nur wenige Jahre zurückliegen, nicht mehr direkt mit dem aktuellen TODR verglichen werden können.
Tabellen zu den TODR-Epochen
EPOCH= | Datum und | Datum und | Wert des TODR von | Wert des TODR bis |
00 | 1.1.1900 | 17.9.2042 | 00000000 00000000 | FFFFFFFF FFFFF000 |
01 | 2.12.1908 | 19.8.2051 | 10000000 00000000 | 0FFFFFFF FFFFF000 |
02 | 3.11.1917 | 20.7.2060 | 20000000 00000000 | 1FFFFFFF FFFFF000 |
03 | 5.10.1926 | 21.6.2069 | 30000000 00000000 | 2FFFFFFF FFFFF000 |
04 | 6.9.1935 | 23.5.2078 | 40000000 00000000 | 3FFFFFFF FFFFF000 |
05 | 7.8.1944 | 24.4.2087 | 50000000 00000000 | 4FFFFFFF FFFFF000 |
06 | 8.7.1953 | 24.3.2096 | 60000000 00000000 | 5FFFFFFF FFFFF000 |
07 | 9.6.1962 | 24.2.2105 | 70000000 00000000 | 6FFFFFFF FFFFF000 |
08 | 11.5.1971 | 26.1.2114 | 80000000 00000000 | 7FFFFFFF FFFFF000 |
09 | 11.4.1980 | 28.12.2122 | 90000000 00000000 | 8FFFFFFF FFFFF000 |
0A | 13.3.1989 | 29.11.2131 | A0000000 00000000 | 9FFFFFFF FFFFF000 |
0B | 11.2.1998 | 29.10.2140 | B0000000 00000000 | AFFFFFFF FFFFF000 |
0C | 13.1.2007 | 30.9.2149 | C0000000 00000000 | BFFFFFFF FFFFF000 |
0D | 15.12.2015 | 1.9.2158 | D0000000 00000000 | CFFFFFFF FFFFF000 |
0E | 15.11.2024 | 3.8.2167 | E0000000 00000000 | DFFFFFFF FFFFF000 |
0F | 17.10.2033 | 4.7.2176 | F0000000 00000000 | EFFFFFFF FFFFF000 |
Tabelle 49: alle TODR-Epochen mit <epc> = 0
EPOCH= | Datum und | Datum und | Wert des TODR von | Wert des TODR bis |
00 | 1.1.1900 | 17.9.2042 | 000000 00000000 | FFFFFF FFFFF000 |
10 | 17.9.2042 | 4.6.2185 | 000000 00000000 | FFFFFF FFFFF000 |
20 | 4.6.2185 | 21.2.2328 | 000000 00000000 | FFFFFF FFFFF000 |
... | ||||
F0 | 12.9.4040 | 31.5.4183 | 000000 00000000 | FFFFFF FFFFF000 |
Tabelle 50: Haupt-Epochen des TODR (<epc> = 0, 1, 2 ...)
TODR-Format TODX
In BS2000 gibt es das Format TODX für das TODR. TODX besteht aus einem Doppelwort und enthält die Anzahl der Mikrosekunden seit Beginn der Standard-Epoche (1.1.1900
00:00:00 Uhr).
Das Format TODX wird in den Benutzer-Makros CTIME (Rechnen mit Zeitstempeln) und GTIME (Datum und Uhrzeit anfordern) verwendet bzw. geliefert, siehe Handbuch „Makroaufrufe an den Ablaufteil [30]. Es dient auch zur Epochen-unabhängigen Darstellung eines Zeitstempels und zum Rechnen mit Zeitstempeln aus unterschiedlichen Epochen.
Innerhalb der Standard-Epoche entspricht TODX einem TODR, dessen Inhalt um 12 Bit nach rechts geschoben ist. Im Gegensatz zum TODR (Obergrenze 17.9.2042
23:53:47.370495 Uhr) reicht die obere Grenze von TODX jedoch weit in die Zukunft (Obergrenze 18.3.4317 02:44:48.587775). Diese Obergrenze beruht auf dem inneren Zusammenhang mit dem um EPD erweiterten TODR-Format.
Rechnen mit TODR-Epochen
Folgender Algorithmus berechnet aus einem gegebenen TODR und dem zugehörigen Wert des EPD die Anzahl der Mikrosekunden seit Beginn der Standard-Epoche (1.1.1900,
0 Uhr), also das TODX-Format.
:* todx: Anzahl der Mikrosekunden seit 1.1.1900 00:00:00.000000 Uhr :* todr: Wert des TODR, geliefert von GTIME oder CTIME :* epd : Wert des EPD, geliefert von GTIME :* epc : Epoch-Counter (erste Sedezimalziffer des EPD) :* epo : Epoch-Offset (zweite Sedezimalziffer des EPD) epc:=epd >> 4; :* epc wird gebildet aus epd, um 4 Bit nach rechts verschoben epo:=epd & x'0F'; :* epo wird gebildet aus epd, linke 4 Bit gelöscht todx:=todr >> (3*4); :* todx wird initialisiert aus gegebenem todr, um 12 Bit nach rechts :* verschoben if((todx >> 12*4) LT epo) epc:=epc+1; :* wenn das initialisierte todx (verschoben um weitere 48 Bit nach rechts) :* kleiner ist als epo, dann liegt die Zeit in der nächsten Haupt-Epoche; :* epc muss also um eins erhöht werden. todx:=todx + epc * x'00100000 00000000'; :* korrektur des initialisierten todx um den Wert von epc
Der höchste mögliche Wert für TODX ergibt sich für epd=x'FF'
und todr=x'EFFFFFFF FFFFF000'
zu todx=x'010EFFFF FFFFFFFF'
.
Weiterhin gilt für eine gegebene Epoche EPD:
Epochenbeginn:
TODX = EPC << (13*4) + EPO << (12*4)
(einschließlich)Epochenende:
TODX = (EPC+1) << (13*4) + EPO << (12*4)
(ausschließlich)
Anmerkung
Ein Zeitstempel todr
der Standard-Epoche, wie er möglicherweise in „alten“ Datenbeständen noch existiert, kann mit obigem Algorithmus einfach in das TODX-Format gebracht werden und dann mit einem TODX-Wert einer beliebigen Epoche verglichen werden. Da in diesem Fall epd=0
ist, reduziert sich der Algorithmus auf: todx:=todr >> (3*4)
.