Negli anni '90, gli ingegneri informatici COBOL hanno escogitato un modo per estendere i campi di data a sei cifre convertendoli in YYYDDD
dove si YYY
trova year - 1900
ed DDD
è il giorno dell'anno [001 to 366]
. Questo schema potrebbe estendere la data massima a 2899-12-31
.
Nell'anno 2898, gli ingegneri iniziarono a farsi prendere dal panico perché le loro basi di codice di 900 anni stavano per fallire. Essendo dell'anno 2898, hanno appena usato la loro macchina del tempo per inviare un Codeinator solitario all'anno 1998 con questo algoritmo e il compito di implementarlo nel modo più ampio possibile:
Utilizzare uno schema in
PPQQRR
cui se01 ≤ QQ ≤ 12
quindi è unaYYMMDD
data standard nel 1900, ma seQQ > 12
quindi rappresenta i giorni successivi2000-01-01
nella base 100 perPP
eRR
ma base 87 perQQ - 13
.
Questo schema si estende ben oltre l'anno 2899 ed è anche retrocompatibile con le date standard, quindi non sono necessarie modifiche agli archivi esistenti.
Qualche esempio:
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
La tua sfida è scrivere un programma o una funzione per accettare input come PPQQRR
e output come data ISO YYYY-MM-DD
. Il metodo di input può essere un parametro, una console o una riga comandi, qualunque sia la più semplice.
Per il tuo divertimento, ecco una soluzione non competitiva in 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
non funziona da anni >=2000
, questo è l'intero punto della debacle Y2K.
yyyy-mm-dd
formato ISO .