Bei einem nicht negativen ganzzahligen Datumscode im Excel-Stil geben Sie das entsprechende "Datum" in einer angemessenen Form zurück, in der Jahr, Monat und "Tag" deutlich angegeben sind.
Trivial, könnte man meinen. Haben Sie die "Angstzitate" bemerkt? Ich habe diese verwendet, weil Excel einige Macken hat. Excel zählt Tage mit der Nummer 1 für den Monat Januar 1 st , 1900, aber als ob 1900 einen Januar hatte 0 - ten und 29. Februar th , so sehr vorsichtig sein , alle Testfälle , um zu versuchen:
Input → Output (example format)
0 → 1900-01-00 Note: NOT 1899-12-31
1 → 1900-01-01
2 → 1900-01-02
59 → 1900-02-28
60 → 1900-02-29 Note: NOT 1900-03-01
61 → 1900-03-01
100 → 1900-04-09
1000 → 1902-09-26
10000 → 1927-05-18
100000 → 2173-10-14
code-golf
date
conversion
Adam
quelle
quelle
DayOfWeek
Verfahren , weil die ursprüngliche Epoche, 1899-12-30 (oder das fiktive 1900-01-00) wurde so gewählt, dass der Wochentag einfach der Mod-7 der Tageszahl war, aber das funktioniert nicht mit 1899-12-30.Antworten:
Excel, 3 (+7?)
mit format
Reiner Hafen
quelle
k (kdb + 3,5),
55545150 BytesFügen Sie zum Testen diese Zeile in die q-Konsole ein:
die Ausgabe sollte sein
{
}
ist eine Funktion mit Argumentx
0 60?x
Index vonx
unter0 60
oder 2, wenn nicht gefundenˋ1900.01.00ˋ1900.02.29
eine Liste von zwei Symbolen,
anhängen"d"$
in ein Datum umgewandeltx-36526
Anzahl der Tage seit 1900 (anstelle des Standardwerts 2000)- x<60
korrigieren Sie den Sprungfehler von Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
Gegenüberstellung bedeutet Indizierung - das "@" in der Mitte ist implizit$
In String konvertierenquelle
{$[x;$`d$x-65746;"1900.01.00"]}
scheint es zu funktionieren . Ich gehe davon aus, dass irgendwo etwas überläuft100000
.Python 2 , 111 Bytes
Probieren Sie es online!
-5 danke an ngn .
quelle
JavaScript (ES6),
89 8277 ByteGespeichert
712 Bytes dank @tshProbieren Sie es online!
quelle
n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
new Date(0,0,1)
ist das gleiche wienew Date(1900,0,1)
. Also190
spart entfernen 3 Bytes. Und ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Sauber ,
205189 BytesProbieren Sie es online!
quelle
Japt, 43 Bytes
Endete mit einem Teil Port von Arnauld's Lösung .
Die Ausgabe erfolgt im
yyyy-m-d
Format.Probieren Sie es online oder testen Sie 0-100
quelle
APL (Dyalog Classic) , 31 Byte
Anonyme implizite Präfixfunktion. Rückgabedatum als
[Y,M,D]
Probieren Sie es online!
×
Vorzeichen des Datumscodes⊢-
subtrahiere das vom Argument (dem Datumscode)60∘>+
Inkrementieren, wenn der Datumscode über sechzig liegt2⎕NQ#263,
Verwenden Sie dies als unmittelbares Argument für "Ereignis 263" (IDN bis heute).IDN entspricht dem Datumscode von Excel, jedoch ohne den 29. Februar 1900, und der Tag vor dem 1. Januar 1900 ist der 31. Dezember 1899
3↑
nimm die ersten drei Elemente davon (das vierte ist der Wochentag)(
…)+
Fügen Sie Folgendes hinzu:60∘≠
0, wenn der Datumscode 60 ist; 1, wenn der Datumscode nicht 60 ist×-
subtrahieren Sie das vom Vorzeichen des Datumscodes¯3↑
nimm die letzten drei Elemente (es gibt nur ein), die mit (zwei) Nullen aufgefüllt sindentwickelt zusammen mit @ Adám im Chat
quelle
C # (.NET Core) ,
186 bis185 ByteProbieren Sie es online!
-1 Byte durch Ersetzen des OR-Operators (||) durch den binären OR-Operator (|).
quelle
Perl 6 , 81 Bytes
Probieren Sie es online!
quelle
T-SQL,
141 9594 BytesZeilenumbruch dient nur der Lesbarkeit.
Eingang über vorbestehenden Tabelle entnommen i mit ganzzahligem Feld n , pro unseren IO - Standards .
SQL verwendet einen ähnlichen (aber korrigierten) 1-1-1900 Ausgangspunkt für sein internes Datumsformat, so dass ich ihn im nur um 1 oder 2 Tage versetzen muss
DATEADD
Funktion .SQL kann keine Spalte ausgeben, die eine Mischung aus Datums- und Zeichenwerten enthält, sodass ich den
FORMAT
Befehl nicht auslassen kann (da er dann versuchen würde,1/0/1900
in ein Datum zu konvertieren , das natürlich ungültig ist).Das Schöne an SQL ist, dass ich alle Eingabewerte in die Tabelle laden und gleichzeitig ausführen kann. Meine (US) Lokalität hat standardmäßig ein
m/d/yyyy
Datumsformat:BEARBEITEN : 46 Bytes gespart, indem zu einem verschachtelten
IIF()
anstatt des viel ausführlicheren gewechselt wurdeCASE WHEN
.BEARBEITEN 2 : Speichert ein weiteres Byte, indem das
-
vor demIIF
.quelle