Dans les années 1990, les ingénieurs informatiques COBOL ont travaillé un moyen d'étendre les champs de date à six chiffres en les convertissant YYYDDD
où YYY
est le year - 1900
et DDD
est le jour de l'année [001 to 366]
. Ce schéma pourrait prolonger la date maximum à 2899-12-31
.
En 2898, les ingénieurs ont commencé à paniquer parce que leurs bases de code vieilles de 900 ans allaient échouer. À partir de l'année 2898, ils utilisaient simplement leur machine à voyager le temps pour envoyer un codinateur isolé à l'année 1998 avec cet algorithme et la tâche de le mettre en œuvre aussi largement que possible:
Utilisez un schéma
PPQQRR
où01 ≤ QQ ≤ 12
il s'agit d'uneYYMMDD
date standard dans les années 1900, mais siQQ > 12
elle représente les jours suivants2000-01-01
en base 100 pourPP
et laRR
base 87 pourQQ - 13
.
Ce système s'étend bien au-delà de l'année 2899 et est également rétrocompatible avec les dates standard. Aucune modification des archives existantes n'est donc nécessaire.
Quelques exemples:
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
Votre défi consiste à écrire un programme ou une fonction pour accepter les entrées PPQQRR
et sorties en tant que date ISO YYYY-MM-DD
. La méthode de saisie peut être un paramètre, une console ou une ligne de commande, le plus simple.
Pour votre amusement, voici une solution non compétitive dans 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
cela ne fonctionne pas pendant des années >=2000
, c'est tout l'intérêt de la débâcle de l'an 2000.
yyyy-mm-dd
format doit être au format ISO .