Trong những năm 1990, COBOL kỹ sư máy tính làm việc ra một cách để mở rộng trường ngày sáu chữ số bằng cách chuyển đổi chúng sang YYYDDD
nơi YYY
là year - 1900
và DDD
là ngày trong năm [001 to 366]
. Chương trình này có thể kéo dài ngày tối đa đến 2899-12-31
.
Vào năm 2898, các kỹ sư bắt đầu hoảng loạn vì cơ sở mã 900 năm tuổi của họ sẽ thất bại. Từ năm 2898, họ chỉ sử dụng cỗ máy thời gian của mình để gửi một Codeinator đơn độc đến năm 1998 với thuật toán này và nhiệm vụ khiến nó được triển khai rộng rãi nhất có thể:
Sử dụng một lược đồ
PPQQRR
trong đó nếu01 ≤ QQ ≤ 12
đó là mộtYYMMDD
ngày tiêu chuẩn vào những năm 1900, nhưng nếuQQ > 12
sau đó nó đại diện cho những ngày sau2000-01-01
trong cơ sở 100 choPP
vàRR
nhưng cơ sở 87 choQQ - 13
.
Chương trình này mở rộng ra xa hơn năm 2899 và cũng tương thích ngược với ngày tiêu chuẩn, do đó không cần sửa đổi tài liệu lưu trữ hiện có.
Vài ví dụ:
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
Thách thức của bạn là viết một chương trình hoặc chức năng để chấp nhận đầu vào PPQQRR
và đầu ra dưới dạng ngày ISO YYYY-MM-DD
. Phương thức nhập liệu có thể là tham số, bàn điều khiển hoặc dòng lệnh, bất cứ điều gì là dễ nhất.
Để bạn giải trí, đây là một giải pháp không thể lọc trong 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
không hoạt động trong nhiều năm >=2000
, đó là toàn bộ vấn đề của sự kiện Y2K.
yyyy-mm-dd
định dạng ISO .