W latach 90. inżynierowie COBOL opracowali sposób rozszerzenia sześciocyfrowych pól daty, przekształcając je YYYDDD
tam, gdzie YYY
jest year - 1900
i gdzie jest DDD
dzień roku [001 to 366]
. Ten schemat może przedłużyć maksymalny termin do 2899-12-31
.
W roku 2898 inżynierowie zaczęli panikować, ponieważ ich 900-letnie bazy kodów uległy awarii. Będąc od roku 2898, właśnie wykorzystali swój wehikuł czasu, aby wysłać samotnego Codeinatora do roku 1998 z tym algorytmem i zadaniem jego wdrożenia w jak najszerszym zakresie:
Użyj schematu
PPQQRR
gdzie jeśli01 ≤ QQ ≤ 12
to jest to standardowyYYMMDD
termin w 1900, ale czyQQ > 12
to oznacza dni po2000-01-01
w bazie 100 dlaPP
aRR
jednak podstawy 87 zaQQ - 13
.
Program ten wykracza daleko poza rok 2899 i jest również wstecznie zgodny ze standardowymi datami, więc nie są wymagane modyfikacje istniejących archiwów.
Kilka przykładów:
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
Wyzwanie polega na napisaniu programu lub funkcji, która będzie akceptować dane wejściowe PPQQRR
i wyjściowe jako datę ISO YYYY-MM-DD
. Metodą wprowadzania może być parametr, konsola lub wiersz poleceń, cokolwiek jest najłatwiejsze.
Dla twojej rozrywki, oto niekonkurencyjne rozwiązanie w 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
nie działa przez lata >=2000
, to jest sedno klęski Y2K.
yyyy-mm-dd
formacie ISO .