1990'larda, COBOL bilgisayar mühendisleri dönüştürerek altı haneli tarihi alanlarını genişletmek için bir çıkış yolu çalıştı YYYDDD
nerede YYY
olduğunu year - 1900
ve DDD
yılın günüdür [001 to 366]
. Bu şema en fazla tarihi uzatabilir 2899-12-31
.
2898 yılında, mühendisler paniklemeye başladılar çünkü 900 yıllık kod üsleri başarısız olacaktı. 2898 yılından itibaren, zaman makinelerini bu algoritma ve mümkün olduğunca geniş bir şekilde uygulayabilmek için 1998 yılına yalnız bir Codeinator göndermek için kullandılar:
Bir şemayı kullanın
PPQQRR
eğer01 ≤ QQ ≤ 12
o zaman bir standarttırYYMMDD
1900'lü yıllarda tarih, ama eğerQQ > 12
o zaman günler sonra temsil2000-01-01
için tabanın 100PP
veRR
için değil, tabanın 87QQ - 13
.
Bu program 2899 yılının çok ötesine uzanıyor ve standart tarihlerle geriye dönük olarak da uyumlu, bu nedenle mevcut arşivlerin değiştirilmesine gerek yok.
Bazı örnekler:
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
Buradaki zorluk, girdiyi PPQQRR
ve çıktıyı ISO tarihi olarak kabul edecek bir program veya işlev yazmaktır YYYY-MM-DD
. Giriş yöntemi, en kolay olanı parametre, konsol veya komut satırı olabilir.
Eğlenceniz için, COBOL-85’te rekabetçi olmayan bir çözüm:
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
, yıllardır çalışmadığı için >=2000
, Y2K bozulma noktasının tamamı budur.
yyyy-mm-dd
formatında olması gerektiğini söylemeliyim .