Biorąc pod uwagę trzy nieujemne liczby całkowite y
, m
oraz d
(z których co najmniej jeden musi być dodatnia) i poprawną datę z pozytywnym roku (w dowolnym odpowiednim formacie, który obejmuje rok, miesiąc i dzień, a nie informacje dodatkowe), wyjście z data, to jest y
lata, m
miesiące i d
dni po pierwotnej dacie.
Kalendarza gregoriańskiego należy używać dla wszystkich dat (nawet dat poprzedzających przyjęcie kalendarza gregoriańskiego).
Metoda obliczania następnej daty jest następująca:
- Dodaj
y
do roku - Dodaj
m
do miesiąca - Normalizuj datę, stosując najazdy (np.
2018-13-01
->2019-01-01
) - Jeśli dzień minął ostatni dzień miesiąca, zmień go na ostatni dzień miesiąca (np.
2018-02-30
->2018-02-28
) - Dodaj
d
do dnia - Normalizuj datę, stosując najazdy (np.
2019-01-32
->2019-02-01
)
Lata przestępne (lata podzielne przez 4, ale niepodzielne przez 100, chyba że podzielne przez 400) muszą być odpowiednio obsługiwane. Wszystkie wejścia i wyjścia będą w reprezentatywnym zakresie liczb całkowitych twojego języka.
Przypadki testowe
Przypadki testowe są dostarczane w formacie input => output
, w którym input
znajduje się obiekt JSON.
{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11
Możesz użyć tego JSFiddle do testowania.
To jest golf-golf, więc wygrywa najkrótsze rozwiązanie (w każdym języku).
y
,m
ad
(np mogłybyd
być 2147483000?)All inputs and outputs will be within the representable integer range of your language.
Odpowiedzi:
C (gcc) , 291 bajtów
Ten był całkiem fajny, gdy zwracał te same wartości, co wbudowany JS.
Wypróbuj online!
Bez golfa:
Wypróbuj online!
źródło
perl -MDate :: Calc =: all -E, 28 bajtów
Wymaga to 6 argumentów: roku wprowadzenia, miesiąca i daty (jako osobnych argumentów) oraz liczby lat, miesięcy i dni do dodania.
źródło
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
Zwraca2001 3 1
zamiast tego,2001 2 28
jak oczekuje OP (przypadek testowy 6).R , 88 bajtów
Wypróbuj online!
Funkcja, która pobiera 3 argumenty (
Y,M,D
) dla daty i inne 3 argumenty (y,m,d
) dla wartości, które mają zostać dodane.Wyjście jest wyposażony poprzedzany
12:00:00 GMT
który jest domyślnym formatem dlaISOdate
„sźródło
Perl 6 ,
60 50 4544 bajtówSprawdź to (60)
Wejście jest
( "2000-02-29", year => 1, month => 0, day => 0 )
Sprawdź to (50)
Wejście jest
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Sprawdź to (45) Dane
wejściowe to
( Date.new("2000-02-29"), %( year => 1 ) )
(Nie trzeba dołączać kluczy o wartości 0)
Sprawdź to (44)
Wejście jest
( Date.new("2000-02-29"), year => 1 )
Rozszerzony:
źródło
for
C # (.NET Core) , 48 bajtów
Wypróbuj online!
źródło
Java 8, 51 bajtów
Input (
s
) i output są jednocześniejava.time.LocalDate
.Wypróbuj online.
Wyjaśnienie:
źródło
R , 65 bajtów
Używa
lubridate
paczki.%m+%
Operator infix jest cukier doadd_with_rollback
funkcji, która implementuje co zasadniczo kwestia prosi.TIO nie ma,
lubridate
więc możesz wypróbować tutaj zamiast tego z dodatkiemf <-
do powyższej funkcji i przypadków testowych:źródło
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(wymagają poza funkcją)Bash ,
150149 bajtówWypróbuj online!
Pobiera dane wejściowe za pomocą argumentów wiersza poleceń w kolejności: stary rok, stary miesiąc, stary dzień. zmiana roku, zmiana miesiąca, zmiana dnia. Zwraca ciąg podobny
Wed Feb 28 00:00:00 UTC 2018
do standardowego.źródło
PHP , 203 bajty
Aby uruchomić:
Przykład:
Lub wypróbuj online!
Testy: Wypróbuj online!
źródło
T-SQL, 53 bajty
Nie jestem pewien, czy to ma znaczenie, ale stosuję korektę roku, a następnie korektę miesiąca, a następnie dzień. Wszystkie wartości testowe sprawdź.
Zgodnie z naszymi standardami IO , wejście pochodzi z wcześniej istniejących tabeli T z datą pola A i całkowitą pola y , m i d .
Co ciekawe, to nie wielkość liter ma znaczenie między kodami typu daty ( D , M i Y ) a moimi wartościami wejściowymi ( d , m i y ), lecz po prostu kolejność parametrów w
DATEADD
funkcji SQL .źródło
2001 3 1
zamiast2001 2 28
wkładu 6.