In den 1990er Jahren arbeitete COBOL Informatiker einen Ausweg aus sechsstelligen Datumsfelder zu erweitern , indem sie auf die Umwandlung , YYYDDD
wo YYY
ist das year - 1900
und DDD
ist der Tag des Jahres [001 to 366]
. Dieses Schema könnte das maximale Datum auf verlängern 2899-12-31
.
Im Jahr 2898 gerieten die Ingenieure in Panik, weil ihre 900 Jahre alten Codebasen ausfallen würden. Da sie aus dem Jahr 2898 stammten, benutzten sie nur ihre Zeitmaschine, um einen einsamen Codeinator mit diesem Algorithmus und der Aufgabe, ihn so weit wie möglich zu implementieren, in das Jahr 1998 zu schicken:
Verwenden Sie ein Schema,
PPQQRR
in dem, wenn es sich01 ≤ QQ ≤ 12
dann um ein StandarddatumYYMMDD
in den 1900er Jahren handelt, in dem Fall jedochQQ > 12
die Tage danach2000-01-01
in Basis 100 fürPP
undRR
Basis 87 für dargestellt werdenQQ - 13
.
Dieses Schema geht weit über das Jahr 2899 hinaus und ist auch mit Standarddaten abwärtskompatibel, sodass keine Änderungen an vorhandenen Archiven erforderlich sind.
Einige Beispiele:
PPQQRR YYYY-MM-DD
000101 1900-01-01 -- minimum conventional date suggested by J. Allen
010101 1901-01-01 -- edge case suggested by J. Allen
681231 1968-12-31 -- as above
991231 1999-12-31 -- maximum conventional date
001300 2000-01-01 -- zero days after 2000-01-01
008059 2018-07-04 -- current date
378118 2899-12-31 -- maximum date using YYYDDD scheme
999999 4381-12-23 -- maximum date using PPQQRR scheme
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die Eingaben als PPQQRR
ISO-Datum und Ausgaben als ISO-Datum akzeptiert YYYY-MM-DD
. Die Eingabemethode kann ein Parameter, eine Konsole oder eine Befehlszeile sein, was immer am einfachsten ist.
Für Ihre Unterhaltung ist hier eine nicht konkurrierende Lösung in COBOL-85:
IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CONVERSION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 T PIC 9(8).
01 U PIC 9(8).
01 D VALUE '999999'.
05 P PIC 9(2).
05 Q PIC 9(2).
05 R PIC 9(2).
01 F.
05 Y PIC 9(4).
05 M PIC 9(2).
05 D PIC 9(2).
PROCEDURE DIVISION.
IF Q OF D > 12 THEN
MOVE FUNCTION INTEGER-OF-DATE(20000101) TO T
COMPUTE U = R OF D + 100 * ((Q OF D - 13) + 87 * P OF D) + T
MOVE FUNCTION DATE-OF-INTEGER(U) TO F
DISPLAY "Date: " Y OF F "-" M OF F "-" D OF F
ELSE
DISPLAY "Date: 19" P OF D "-" Q OF D "-" R OF D
END-IF.
STOP RUN.
yymmdd
nicht mehr funktioniert >=2000
, das ist der springende Punkt des Y2K-Debakels.
yyyy-mm-dd
Format sein muss.