1990年代には、COBOLのコンピュータエンジニアがそれらを変換することにより、6桁の日付フィールドを拡張する方法働いた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日付として受け入れ、出力を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の大失敗の全体的なポイントです。