Biorąc pod uwagę nieujemną liczbę całkowitą kod daty w stylu Excel, zwróć odpowiednią „datę” w dowolnej rozsądnej formie, która wyraźnie pokazuje rok, miesiąc i „dzień”.
Trywialne, może się wydawać. Czy zauważyłeś „przerażające cytaty”? Użyłem ich, ponieważ Excel ma pewne dziwactwa. Excel liczy dni z numerem 1 na 1 stycznia st 1900, ale jakby miała stycznia 1900 0 th i 29 lutego th , więc być bardzo ostrożny, aby spróbować wszystkich przypadków testowych:
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ám
źródło
źródło
DayOfWeek
metoda, ponieważ oryginalny epoka, 30.12.1899 (lub fikcyjny 1900-01-00) został wybrany tak, że dzień tygodnia był po prostu mod-7 numeru dnia, ale to nie zadziała z 1899-12-30.Odpowiedzi:
Excel, 3 (+7?)
z formatem
Czysty port
źródło
k (kdb + 3,5),
55545150 bajtówaby przetestować, wklej ten wiersz do konsoli q:
wyjście powinno być
{
}
jest funkcją z argumentemx
0 60?x
indeksx
spośród0 60
lub 2, jeśli nie znalezionoˋ1900.01.00ˋ1900.02.29
lista dwóch symboli,
dołącz do niego"d"$
konwertowane na datęx-36526
liczba dni od 1900 roku (zamiast domyślnego 2000)- x<60
skoryguj o błąd skoku programu Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
zestawienie oznacza indeksowanie - „@” pośrodku jest niejawne$
przekonwertować na ciągźródło
{$[x;$`d$x-65746;"1900.01.00"]}
Wydaje się , że w przypadku innej wersji k (k5 / k6) działa . Zakładam, że coś się gdzieś przelewa100000
.Python 2 , 111 bajtów
Wypróbuj online!
-5 dzięki ngn .
źródło
JavaScript (ES6),
89 8277 bajtówZaoszczędź
712 bajtów dzięki @tshWypróbuj online!
źródło
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)
to samonew Date(1900,0,1)
. Więc usuń190
zapisuje 3 bajty. I ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Czysty ,
205189 bajtówWypróbuj online!
źródło
Japt, 43 bajty
Skończyło się to częściowym portem rozwiązania Arnaulda .
Dane wyjściowe są w
yyyy-m-d
formacie.Wypróbuj online lub przetestuj 0-100
źródło
APL (Dyalog Classic) , 31 bajtów
Anonimowa ukryta funkcja prefiksu. Zwraca datę jako
[Y,M,D]
Wypróbuj online!
×
znak kodu daty⊢-
odejmij to od argumentu (kod daty)60∘>+
przyrost, jeśli kod daty jest większy niż sześćdziesiąt2⎕NQ#263,
użyj tego jako bezpośredniego argumentu dla „Zdarzenia 263” (IDN do tej pory)IDN jest jak kod daty Excela, ale bez 29 lutego 1900 r., a dzień przed 1 stycznia 1900 r. to 31 grudnia 1899 r.
3↑
weź trzy pierwsze elementy (czwarty to dzień tygodnia)(
…)+
Dodaj następujące elementy:60∘≠
0, jeśli kod daty to 60; 1, jeśli kod daty nie ma 60×-
odejmij to od znaku kodu daty¯3↑
weź trzy ostatnie elementy (jest tylko jeden) wypełnienie (dwoma) zeramiopracowane wspólnie z @ Adám na czacie
źródło
C # (.NET Core) ,
186185 bajtówWypróbuj online!
-1 bajt poprzez zastąpienie operatora OR (||) binarnym operatorem OR (|).
źródło
Perl 6 , 81 bajtów
Wypróbuj online!
źródło
T-SQL,
141 9594 bajtówPodział linii służy wyłącznie do odczytu.
Dane wejściowe są pobierane za pośrednictwem istniejącej tabeli i z polem całkowitym n , zgodnie z naszymi standardami we / wy .
SQL używa podobnego (ale poprawionego) punktu początkowego 1-1-1900 dla swojego wewnętrznego formatu daty, więc muszę go przesunąć tylko o 1 lub 2 dni w
DATEADD
funkcji.SQL nie może wypisać kolumny zawierającej mieszankę wartości daty i znaków, więc nie mogę pominąć
FORMAT
polecenia (ponieważ wtedy próbowałby przekonwertować1/0/1900
na datę, co oczywiście jest nieprawidłowe).Zaletą SQL jest to, że mogę załadować wszystkie wartości wejściowe do tabeli i uruchomić je wszystkie naraz. Domyślną lokalizacją w mojej (USA) jest
m/d/yyyy
format daty:EDYCJA : Zapisano 46 bajtów, zmieniając na zagnieżdżony
IIF()
zamiast o wiele bardziej szczegółowyCASE WHEN
.EDYCJA 2 : Zapisano kolejny bajt, przesuwając
-
przed nimIIF
.źródło