En la década de 1990, los ingenieros informáticos de COBOL descubrieron una forma de ampliar los campos de fecha de seis dígitos al convertirlos a YYYDDD
dónde YYY
es year - 1900
y DDD
es el día del año [001 to 366]
. Este esquema podría extender la fecha máxima a 2899-12-31
.
En el año 2898, los ingenieros comenzaron a entrar en pánico porque sus bases de código de 900 años iban a fallar. Siendo del año 2898, simplemente usaron su máquina del tiempo para enviar un Codeinator solitario al año 1998 con este algoritmo y la tarea de implementarlo lo más ampliamente posible:
Utilice un esquema
PPQQRR
en el que si01 ≤ QQ ≤ 12
es unaYYMMDD
fecha estándar en el siglo XX, pero siQQ > 12
representa los días posteriores2000-01-01
en la base 100 paraPP
y laRR
base 87 paraQQ - 13
.
Este esquema se extiende mucho más allá del año 2899 y también es compatible con las fechas estándar, por lo que no se requieren modificaciones de los archivos existentes.
Algunos ejemplos:
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
Su desafío es escribir un programa o función para aceptar la entrada PPQQRR
y la salida como una fecha ISO YYYY-MM-DD
. El método de entrada puede ser parámetro, consola o línea de comando, lo que sea más fácil.
Para su diversión, aquí hay una solución no competitiva en 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
no funciona durante años >=2000
, ese es el objetivo de la debacle de Y2K.
yyyy-mm-dd
formato ISO .