Gegeben drei nicht negative ganze Zahlen y
, m
und d
(von denen mindestens einer muss positiv sein) und ein gültiges Datum mit einem positiven Jahr (in jedem vernünftigen Format , das das Jahr enthält, Monat und Tag, und keine weiteren Informationen), Ausgabe der Datum, das y
Jahre, m
Monate und d
Tage nach dem ursprünglichen Datum liegt.
Der Gregorianische Kalender ist für alle Daten zu verwenden (auch Daten vor der Annahme des Gregorianischen Kalenders).
Die Methode zur Berechnung des nächsten Datums lautet wie folgt:
y
Zum Jahr hinzufügen- In
m
dem Monat - Normalisieren Sie das Datum durch Anwenden von Rollovers (z. B.
2018-13-01
->2019-01-01
). - Wenn der Tag nach dem letzten Tag des Monats liegt, ändern Sie ihn auf den letzten Tag des Monats (z. B.
2018-02-30
->2018-02-28
). d
Zum Tag hinzufügen- Normalisieren Sie das Datum durch Anwenden von Rollovers (z. B.
2019-01-32
->2019-02-01
).
Schaltjahre (Jahre, die durch 4 teilbar sind, aber nicht durch 100 teilbar sind, es sei denn, sie sind auch durch 400 teilbar) müssen angemessen behandelt werden. Alle Ein- und Ausgänge liegen im darstellbaren Ganzzahlbereich Ihrer Sprache.
Testfälle
Die Testfälle werden in dem Format zur Verfügung gestellt input => output
, in dem input
ein JSON - Objekt ist.
{"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
Sie können diese JSFiddle zum Testen verwenden.
Dies ist Code-Golf , also gewinnt die kürzeste Lösung (in jeder Sprache).
y
,m
undd
(zB könnted
2147483000 sein?)All inputs and outputs will be within the representable integer range of your language.
Antworten:
C (gcc) , 291 Bytes
Es hat ziemlich viel Spaß gemacht, die gleichen Werte wie das eingebaute JS zurückzugeben.
Probieren Sie es online aus!
Nicht Golf:
Probieren Sie es online aus!
quelle
perl -MDate :: Calc =: all -E, 28 Bytes
Dies erfordert 6 Argumente: das Eingabejahr, den Monat und das Datum (als separate Argumente) sowie die Anzahl der Jahre, Monate und Tage, die hinzugefügt werden müssen.
quelle
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
Rückgabe2001 3 1
statt2001 2 28
wie vom OP erwartet (Testfall 6).R 88 Bytes
Probieren Sie es online aus!
Eine Funktion, die 3 Argumente (
Y,M,D
) für das Datum und 3 weitere Argumente (y,m,d
) für die hinzuzufügenden Werte verwendet.Die Ausgabe wird mit vorangestelltem
12:00:00 GMT
Format geliefert. Dies ist das Standardformat fürISOdate
'squelle
Perl 6 ,
60 50 4544 BytesTest it (60)
Eingang ist
( "2000-02-29", year => 1, month => 0, day => 0 )
Test it (50)
Eingang ist
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Test it (45)
Eingabe ist
( Date.new("2000-02-29"), %( year => 1 ) )
(Es müssen keine Schlüssel mit dem Wert 0 eingefügt werden)
Test it (44)
Eingang ist
( Date.new("2000-02-29"), year => 1 )
Erweitert:
quelle
for
C # (.NET Core) , 48 Byte
Probieren Sie es online aus!
quelle
Java 8, 51 Bytes
Input (
s
) und Output sind beidejava.time.LocalDate
.Probieren Sie es online aus.
Erläuterung:
quelle
R , 65 Bytes
Verwendet das
lubridate
Paket. Der%m+%
Infix-Operator ist Zucker für dieadd_with_rollback
Funktion, die im Wesentlichen implementiert, was die Frage verlangt.TIO hat nicht
lubridate
so Sie können es hier stattdessen versuchen , mitf <-
voran auf die Funktion oben zusammen mit Testfällen:quelle
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(erfordern außerhalb der Funktion)Bash ,
150149 BytesProbieren Sie es online aus!
Nimmt Eingaben über Befehlszeilenargumente in der Reihenfolge vor: altes Jahr, alter Monat, alter Tag. Jahreswechsel, Monatswechsel, Tageswechsel. Gibt eine Zeichenfolge wie
Wed Feb 28 00:00:00 UTC 2018
stdout aus.quelle
PHP , 203 Bytes
Um es auszuführen:
Beispiel:
Oder probieren Sie es online!
Tests: Probieren Sie es online aus!
quelle
T-SQL, 53 Bytes
Ich bin mir nicht sicher, ob es wichtig ist, aber ich wende die Jahresanpassung an, gefolgt von der Monatsanpassung, gefolgt vom Tag. Alle Testwerte werden ausgecheckt.
Gemäß unseren E / A-Standards wird die Eingabe aus einer bereits vorhandenen Tabelle t mit den Datumsfeldern a und den ganzzahligen Feldern y , m und d übernommen .
Interessanterweise ist es nicht die Groß- und Kleinschreibung, die zwischen den Datumstypcodes ( D , M und Y ) und meinen Eingabewerten ( d , m und y ) von Bedeutung ist, sondern lediglich die Reihenfolge der Parameter in der SQL-
DATEADD
Funktion .quelle
2001 3 1
statt2001 2 28
für Eingabe 6 geben würde .