Na década de 1990, os engenheiros de computação da COBOL desenvolveram uma maneira de estender os campos de data de seis dígitos, convertendo-os para YYYDDD
onde YYY
é year - 1900
e DDD
é o dia do ano [001 to 366]
. Esse esquema pode estender a data máxima para 2899-12-31
.
No ano de 2898, os engenheiros começaram a entrar em pânico porque suas bases de código de 900 anos estavam falhando. Sendo do ano de 2898, eles apenas usaram sua máquina do tempo para enviar um Codeinator solitário para o ano de 1998 com esse algoritmo e a tarefa de implementá-lo o mais amplamente possível:
Use um esquema em
PPQQRR
que se01 ≤ QQ ≤ 12
é umaYYMMDD
data padrão nos anos 1900, mas seQQ > 12
representa os dias seguintes2000-01-01
na base 100PP
e naRR
base 87 paraQQ - 13
.
Esse esquema se estende muito além do ano 2899 e também é compatível com as datas padrão, portanto, não são necessárias modificações nos arquivos existentes.
Alguns exemplos:
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
Seu desafio é escrever um programa ou função para aceitar entrada PPQQRR
e saída como uma data ISO YYYY-MM-DD
. O método de entrada pode ser parâmetro, console ou linha de comando, o que for mais fácil.
Para sua diversão, aqui está uma solução não-competitiva no 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
não funciona há anos >=2000
, esse é o ponto principal do desastre do Y2K.
yyyy-mm-dd
formato ISO .