Dado un código de fecha entero de estilo Excel no negativo, devuelva la "fecha" correspondiente en cualquier forma razonable que muestre claramente año, mes y "día".
Trivial, puedes pensar. ¿Notaste las "citas de miedo"? Los usé porque Excel tiene algunas peculiaridades. Excel cuenta días con el número 1 para enero 1 st , 1900, pero como si 1900 registró en enero 0 º y Un informe de febrero 29 de XX , por lo que tener mucho cuidado para tratar todos los casos de prueba:
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
Adán
fuente
fuente
DayOfWeek
método porque la época original, 1899-12-30 (o el ficticio 1900-01-00) se eligió de modo que el día de la semana simplemente fuera el mod-7 del número del día, pero eso no funcionará con 1899-12-30.Respuestas:
Excel, 3 (+7?)
con formato
Puerto puro
fuente
k (kdb + 3.5),
55545150 bytespara probar, pegue esta línea en la consola q:
la salida debe ser
{
}
es una función con argumentox
0 60?x
índice dex
entre0 60
o 2 si no se encuentraˋ1900.01.00ˋ1900.02.29
una lista de dos símbolos,
añádele"d"$
convertido a una fechax-36526
número de días desde 1900 (en lugar del predeterminado 2000)- x<60
ajustar por error de salto de Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
yuxtaposición significa indexación: la "@" en el medio está implícita$
convertir a cadenafuente
{$[x;$`d$x-65746;"1900.01.00"]}
parece funcionar . Supongo que algo se desborda en alguna parte100000
.Python 2 , 111 bytes
Pruébalo en línea!
-5 gracias a ngn .
fuente
JavaScript (ES6),
89 8277 bytesGuardado
712 bytes gracias a @tshPruébalo en línea!
fuente
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)
es lo mismo quenew Date(1900,0,1)
. Entonces eliminar190
guarda 3 bytes. Y ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Limpio ,
205189 bytesPruébalo en línea!
fuente
Japt, 43 bytes
Terminé con un puerto parcial de la solución de Arnauld .
La salida está en
yyyy-m-d
formato.Pruébelo en línea o pruebe 0-100
fuente
APL (Dyalog Classic) , 31 bytes
Función de prefijo tácito anónimo. Fecha de devolución como
[Y,M,D]
Pruébalo en línea!
×
signo del código de fecha⊢-
reste eso del argumento (el código de fecha)60∘>+
aumentar si el código de fecha es superior a sesenta2⎕NQ#263,
úselo como argumento inmediato para el "Evento 263" (IDN hasta la fecha)IDN es como el código de fecha de Excel, pero sin el 29 de febrero de 1900, y el día anterior al 1 de enero de 1900 es el 31 de diciembre de 1899
3↑
tome los primeros tres elementos de eso (el cuarto es el día de la semana)(
…)+
Agregue lo siguiente a aquellos:60∘≠
0 si el código de fecha es 60; 1 si el código de fecha no es 60×-
reste eso del signo del código de fecha¯3↑
tome los últimos tres elementos (solo hay uno) relleno con (dos) cerosdesarrollado junto con @ Adám en el chat
fuente
C # (.NET Core) ,
186185 bytesPruébalo en línea!
-1 byte reemplazando el operador OR (||) con el operador OR binario (|).
fuente
Perl 6 , 81 bytes
Pruébalo en línea!
fuente
T-SQL,
141 9594 bytesEl salto de línea es solo para legibilidad.
La entrada se toma a través de la tabla i existente con el campo entero n , según nuestros estándares IO .
SQL utiliza un punto de inicio similar (pero corregido) 1-1-1900 para su formato de fecha interno, por lo que solo tengo que compensarlo en 1 o 2 días en el
DATEADD
función.SQL no puede generar una columna que contenga una combinación de valores de fecha y caracteres, por lo que no puedo omitir el
FORMAT
comando (ya que luego intentaría convertir1/0/1900
a una fecha, que por supuesto no es válida).Lo bueno de SQL es que puedo cargar todos los valores de entrada en la tabla y ejecutarlos todos a la vez. Mi localidad (de EE. UU.) Tiene un
m/d/yyyy
formato de fecha predeterminado :EDITAR : guardó 46 bytes al cambiar a un anidado en
IIF()
lugar del mucho más detalladoCASE WHEN
.EDITAR 2 : guardado otro byte moviendo el
-
frente deIIF
.fuente