在20世纪90年代,COBOL电脑工程师摸索出了一种通过将它们转换为延长六位数的日期字段YYYDDD
,其中YYY
是year - 1900
和DDD
是一年中的一天[001 to 366]
。此方案可以将最长日期延长到2899-12-31
。
在2898年,工程师们开始恐慌,因为他们已有900年历史的代码库将要失败。从2898年开始,他们只是使用自己的时间机器将一个单独的Codeinator发送到1998年,并使用了该算法,并实现了尽可能广泛地实现它的任务:
请使用一种方案
PPQQRR
,在这种情况下,如果它是1900年代01 ≤ QQ ≤ 12
的标准YYMMDD
日期,但如果QQ > 12
它代表2000-01-01
,则以100为底PP
,RR
而以87为底QQ - 13
。
该方案已远远超过2899年,并且也与标准日期向后兼容,因此不需要修改现有档案。
一些例子:
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
您面临的挑战是编写一个程序或函数以接受输入PPQQRR
和输出作为ISO日期YYYY-MM-DD
。输入法可以是参数,控制台或命令行,最简单的方法是。
为了娱乐,这是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
多年来没有工作>=2000
,这就是Y2K崩溃的全部要点。