Étant donné un code de date de type Excel entier non négatif, renvoyez la "date" correspondante sous toute forme raisonnable qui indique clairement l'année, le mois et le "jour".
Trivial, vous pouvez penser. Avez-vous remarqué les "citations effrayantes"? Je les ai utilisés car Excel a des bizarreries. Excel compte jours avec le numéro 1 pour 1 Janvier er , 1900, mais comme si 1900 avait un Janvier 0 e et A29 Février e , donc être très prudent d'essayer tous les tests:
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
la source
la source
DayOfWeek
méthode parce que l'époque d' origine, 1899-12-30 (ou le fictif 1900-01-00) a été choisi de telle sorte que le jour de la semaine était simplement le mod-7 du numéro du jour, mais cela ne fonctionnera pas avec 1899-12-30.Réponses:
Excel, 3 (+7?)
avec format
Port pur
la source
k (kdb + 3,5),
55545150 octetspour tester, collez cette ligne dans la console q:
la sortie doit être
{
}
est une fonction avec argumentx
0 60?x
indicex
parmi0 60
ou 2 s'il n'est pas trouvéˋ1900.01.00ˋ1900.02.29
une liste de deux symboles,
y ajouter"d"$
converti en datex-36526
nombre de jours depuis 1900 (au lieu de 2000 par défaut)- x<60
ajuster pour l'erreur de saut d'Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
juxtaposition signifie indexation - le "@" au milieu est implicite$
convertir en chaînela source
{$[x;$`d$x-65746;"1900.01.00"]}
semble fonctionner . Je suppose que quelque chose déborde quelque part100000
.Python 2 , 111 octets
Essayez-le en ligne!
-5 grâce à ngn .
la source
JavaScript (ES6),
89 8277 octets712 octets enregistrés grâce à @tshEssayez-le en ligne!
la source
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)
c'est la même chose quenew Date(1900,0,1)
. Donc, supprimer190
enregistre 3 octets. Et ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Nettoyer ,
205189 octetsEssayez-le en ligne!
la source
Japt, 43 octets
Nous nous sommes retrouvés avec un port partiel de la solution d' Arnauld .
La sortie est au
yyyy-m-d
format.Essayez-le en ligne ou testez 0-100
la source
APL (Dyalog Classic) , 31 octets
Fonction de préfixe tacite anonyme. Renvoie la date comme
[Y,M,D]
Essayez-le en ligne!
×
signe du code de date⊢-
soustrayez cela de l'argument (le code de date)60∘>+
incrémenter si le code de date est supérieur à soixante2⎕NQ#263,
utilisez-le comme argument immédiat pour "événement 263" (IDN à ce jour)IDN est exactement comme le code de date d'Excel, mais sans le 29 février 1900 et la veille du 1er janvier 1900 est le 31 décembre 1899
3↑
prendre les trois premiers éléments de cela (le quatrième est le jour de la semaine)(
…)+
Ajoutez ce qui suit à ceux-ci:60∘≠
0 si le code de date est 60; 1 si le code de date n'est pas 60×-
soustrayez cela du signe du code de date¯3↑
prendre les trois derniers éléments (il n'y en a qu'un) remplissage avec (deux) zérosdéveloppé en collaboration avec @ Adám dans le chat
la source
C # (.NET Core) ,
186185octetsEssayez-le en ligne!
-1 octet en remplaçant l'opérateur OR (||) par l'opérateur OR binaire (|).
la source
Perl 6 , 81 octets
Essayez-le en ligne!
la source
T-SQL,
141 9594 octetsLe saut de ligne est uniquement pour la lisibilité.
L'entrée est prise via la table préexistante i avec le champ entier n , selon nos normes IO .
SQL utilise un point de départ similaire (mais corrigé) 1-1-1900 pour son format de date interne, je n'ai donc qu'à le compenser de 1 ou 2 jours dans le
DATEADD
fonction.SQL ne peut pas sortir une colonne contenant un mélange de valeurs de date et de caractère, donc je ne peux pas laisser la
FORMAT
commande (car elle essaierait alors de convertir1/0/1900
en une date, ce qui est bien sûr invalide).Ce qui est bien avec SQL, c'est que je peux charger toutes les valeurs d'entrée dans la table et les exécuter toutes en même temps. Ma localité (US) utilise par défaut un
m/d/yyyy
format de date:EDIT : économisé 46 octets en passant à un imbriqué
IIF()
au lieu du beaucoup plus verbeuxCASE WHEN
.EDIT 2 : Sauvegarde un autre octet en déplaçant le
-
devant duIIF
.la source