In den 1990er Jahren arbeitete COBOL Informatiker einen Ausweg aus sechsstelligen Datumsfelder zu erweitern , indem sie auf die Umwandlung , YYYDDD
wo YYY
ist das year - 1900
und DDD
ist der Tag des Jahres [001 to 366]
. Dieses Schema könnte das maximale Datum auf verlängern 2899-12-31
.
Im Jahr 2898 gerieten die Ingenieure in Panik, weil ihre 900 Jahre alten Codebasen ausfallen würden. Da sie aus dem Jahr 2898 stammten, benutzten sie nur ihre Zeitmaschine, um einen einsamen Codeinator mit diesem Algorithmus und der Aufgabe, ihn so weit wie möglich zu implementieren, in das Jahr 1998 zu schicken:
Verwenden Sie ein Schema,
PPQQRR
in dem, wenn es sich01 ≤ QQ ≤ 12
dann um ein StandarddatumYYMMDD
in den 1900er Jahren handelt, in dem Fall jedochQQ > 12
die Tage danach2000-01-01
in Basis 100 fürPP
undRR
Basis 87 für dargestellt werdenQQ - 13
.
Dieses Schema geht weit über das Jahr 2899 hinaus und ist auch mit Standarddaten abwärtskompatibel, sodass keine Änderungen an vorhandenen Archiven erforderlich sind.
Einige Beispiele:
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
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die Eingaben als PPQQRR
ISO-Datum und Ausgaben als ISO-Datum akzeptiert YYYY-MM-DD
. Die Eingabemethode kann ein Parameter, eine Konsole oder eine Befehlszeile sein, was immer am einfachsten ist.
Für Ihre Unterhaltung ist hier eine nicht konkurrierende Lösung 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
nicht mehr funktioniert>=2000
, das ist der springende Punkt des Y2K-Debakels.yyyy-mm-dd
Format sein muss.001300
.Antworten:
T-SQL,
9998 BytesZeilenumbruch dient nur der Lesbarkeit. Gott sei Dank für das implizite Casting.
Die Eingabe erfolgt über eine bereits vorhandene Tabelle t mit
CHAR
Spalte i , je unseren IO Regeln .Führt die folgenden Schritte aus:
ISDATE()
. (Das Verhalten dieser Funktion hängt von den Spracheinstellungen ab und funktioniert auf meinemenglish-us
Server wie erwartet .) Beachten Sie, dass dies nur eine Überprüfung der Gültigkeit ist. Wenn wir versuchen, es direkt zu analysieren, wird es250101
als 2025-01-01 und nicht als 1925-01-01 dargestellt.19
die Vorderseite (und ändern Sie nicht die Einstellung für die Jahresschneidung auf Serverebene). Die Konvertierung des Enddatums erfolgt am Ende.8700*PP + QQRR - 1300
, vermeidet die (sehr lange) SQL-SUBSTRING()
Funktion. Diese Mathematik sucht nach den bereitgestellten Beispielen, ich bin mir ziemlich sicher, dass es richtig ist.DATEADD
Tage zu addieren2000-01-01
, die kurzgeschlossen werden können2000
.CONVERT()
es zu einem reinen ErgebnisDATE
.Ich dachte an einem Punkt , dass ich ein problematisches Datum gefunden:
000229
. Dies ist das einzige Datum, das für 19xx und 20xx unterschiedlich analysiert wird (seit 2000 war es ein Schaltjahr, 1900 jedoch nicht, da es sich um seltsame Schaltjahr-Ausnahmen handelt ). Aus diesem Grund000229
ist 1900 jedoch nicht einmal eine gültige Eingabe (da 1900, wie bereits erwähnt, kein Schaltjahr war) und muss daher nicht berücksichtigt werden.quelle
ISDATE
dass kein Boolescher Wert zurückgegeben wird oder dass Ganzzahlen nicht implizit in Boolescher Wert konvertiert werden können, daIIF
sonst zwei Bytes eingespart werden könnten.LEFT()
undRIGHT()
Funktionsergebnisse nicht explizit in Ganzzahlen-1300,'2000'
mit-935,'1999'
.R , 126 Bytes
Probieren Sie es online!
quelle
000101
oder681231
) sind nicht möglichJavaScript (SpiderMonkey) , 103 Byte
Probieren Sie es online!
.toJSON
schlägt in einer UTC + X-Zeitzone fehl. Dieser Code funktioniert aber länger (+ 11Bytes):quelle
.toJSON()
.Python 2 , 159 Bytes
Probieren Sie es online!
quelle
... and ... or ...
anstelle von... if ... else ...
.ABAP,
173171 BytesSpart 2 Bytes durch weitere Optimierung der Ausgabe
Der Legende nach sagte ein SAP-Kunde zu Beginn des 21. Jahrhunderts einmal:
Er hatte recht. Heute, 2980, gibt es kein C ++, kein COBOL mehr. Nach dem Krieg mussten alle ihren Code in SAP ABAP umschreiben. Um die Abwärtskompatibilität mit den Resten der COBOL-Programme des 2800 zu gewährleisten, haben unsere Wissenschaftler diese als Subroutine in ABAP neu erstellt.
Es kann von einem Programm wie dem folgenden aufgerufen werden:
Erklärung meines Codes:
Der Dateityp von ABAP hat die Eigenschaft odd, die bei Verwendung als DDMMYYYY formatiert werden soll. Dies kann
WRITE
sogar vom Gebietsschema abhängig sein, obwohl das interne Format YYYYMMDD lautet. Wenn wir jedoch einen Teilstringselektor wied(4)
diesen verwenden, werden die ersten 4 Zeichen des internen Formats ausgewählt, sodass wir JJJJ erhalten.Update : Die Ausgabeformatierung in der Erklärung ist jetzt veraltet, ich habe sie in der Golfversion um 2 Bytes optimiert:
quelle
MUMPS
und wir werden alles überleben!Kotlin , 222 Bytes
Fest codierte Kalenderfeldnamenskonstanten zum Speichern von 49 Bytes.
Probieren Sie es online!
quelle