Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

TODR-Epochen

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
Uhrzeit von

Datum und
Uhrzeit bis

Wert des TODR von

Wert des TODR bis

00

1.1.1900
00:00:00.000000

17.9.2042
23:53:47.370495

00000000 00000000

FFFFFFFF FFFFF000

01

2.12.1908
19:29:36.710656

19.8.2051
19:23:24.081151

10000000 00000000

0FFFFFFF FFFFF000

02

3.11.1917
14:59:13.421312

20.7.2060
14:53:00.791807

20000000 00000000

1FFFFFFF FFFFF000

03

5.10.1926
10:28:50.131968

21.6.2069
10:22:37.502463

30000000 00000000

2FFFFFFF FFFFF000

04

6.9.1935
05:58:26.842624

23.5.2078
05:52:14.213119

40000000 00000000

3FFFFFFF FFFFF000

05

7.8.1944
01:28:03.553280

24.4.2087
01:21:50.923775

50000000 00000000

4FFFFFFF FFFFF000

06

8.7.1953
20:57:40.263936

24.3.2096
20:51:27.634431

60000000 00000000

5FFFFFFF FFFFF000

07

9.6.1962
16:27:16.974592

24.2.2105
16:21:04.345087

70000000 00000000

6FFFFFFF FFFFF000

08

11.5.1971
11:56:53.685248

26.1.2114
11:50:41.055743

80000000 00000000

7FFFFFFF FFFFF000

09

11.4.1980
07:26:30.395904

28.12.2122
07:20:17.766399

90000000 00000000

8FFFFFFF FFFFF000

0A

13.3.1989
02:56:07.106560

29.11.2131
02:49:54.477055

A0000000 00000000

9FFFFFFF FFFFF000

0B

11.2.1998
22.25:43.817216

29.10.2140
22:19:31.187711

B0000000 00000000

AFFFFFFF FFFFF000

0C

13.1.2007
17:55:20.527872

30.9.2149
17:49:07.898367

C0000000 00000000

BFFFFFFF FFFFF000

0D

15.12.2015
13:24:57.238528

1.9.2158
13:18:44.609023

D0000000 00000000

CFFFFFFF FFFFF000

0E

15.11.2024
08:54:33.949184

3.8.2167
08:48:21.319679

E0000000 00000000

DFFFFFFF FFFFF000

0F

17.10.2033
04:24:10.659840

4.7.2176
04:17:58.030335

F0000000 00000000

EFFFFFFF FFFFF000

Tabelle 49: alle TODR-Epochen mit <epc> = 0

EPOCH=

Datum und
Uhrzeit von

Datum und
Uhrzeit bis

Wert des TODR von

Wert des TODR bis

00

1.1.1900
00:00:00.000000

17.9.2042
23:53:47.370495

000000 00000000

FFFFFF FFFFF000

10

17.9.2042
23:53:47.370496

4.6.2185
23:47:34.740991

000000 00000000

FFFFFF FFFFF000

20

4.6.2185
23:47:34.740992

21.2.2328
23:41:22.111487

000000 00000000

FFFFFF FFFFF000

...





F0

12.9.4040
22:26:50.557440

31.5.4183
22:20:37.927935

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).