Compte tenu de trois entiers non négatifs y
, m
et d
(dont au moins un doit être positif) et une date valide une année positive (dans tout format raisonnable qui comprend l'année, le mois et le jour, et aucune information supplémentaire), la sortie du date correspondant à des y
années, des m
mois et des d
jours après la date d'origine.
Le calendrier grégorien doit être utilisé pour toutes les dates (même les dates antérieures à l'adoption du calendrier grégorien).
La méthode de calcul de la prochaine date est la suivante:
- Ajouter
y
à l'année - Ajouter
m
au mois - Normaliser la date en appliquant des survols (par exemple
2018-13-01
->2019-01-01
) - Si le jour est passé le dernier jour du mois, remplacez-le par le dernier jour du mois (par exemple
2018-02-30
->2018-02-28
) - Ajouter
d
à la journée - Normaliser la date en appliquant des survols (par exemple
2019-01-32
->2019-02-01
)
Les années bissextiles (années divisibles par 4, mais non divisibles par 100 sauf si elles sont également divisibles par 400) doivent être traitées de manière appropriée. Toutes les entrées et sorties seront dans la plage entière représentable de votre langue.
Cas de test
Les cas de test sont fournis au format input => output
, où se input
trouve un objet 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
Vous pouvez utiliser ce JSFiddle pour les tests.
Il s'agit de code-golf , donc la solution la plus courte (dans chaque langue) l'emporte.
y
,m
etd
(par exemple pourraitd
être 2147483000?)All inputs and outputs will be within the representable integer range of your language.
Réponses:
C (gcc) , 291 octets
Celui-ci était assez amusant pour obtenir les mêmes valeurs que le JS intégré.
Essayez-le en ligne!
Non-golfé:
Essayez-le en ligne!
la source
perl -MDate :: Calc =: tous -E, 28 octets
Cela prend 6 arguments: l'année, le mois et la date (comme arguments séparés), et le nombre d'années, de mois et de jours à ajouter.
la source
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
retourne2001 3 1
au lieu de ce2001 2 28
que l'OP attend (cas de test 6).R , 88 octets
Essayez-le en ligne!
Une fonction qui prend 3 arguments (
Y,M,D
) pour la date et 3 autres arguments (y,m,d
) pour les valeurs à ajouter.La sortie est livré avec Prepended
12:00:00 GMT
qui est le format par défaut pourISOdate
« sla source
Perl 6 ,
60 50 4544 octetsTestez-le (60) L'
entrée est
( "2000-02-29", year => 1, month => 0, day => 0 )
Testez-le (50) L'
entrée est
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Testez-le (45) L'
entrée est
( Date.new("2000-02-29"), %( year => 1 ) )
(pas besoin d'inclure des clés avec une valeur de 0)
Testez-le (44) L'
entrée est
( Date.new("2000-02-29"), year => 1 )
Étendu:
la source
for
C # (.NET Core) , 48 octets
Essayez-le en ligne!
la source
Java 8, 51 octets
L'entrée (
s
) et la sortie sont toutes les deuxjava.time.LocalDate
.Essayez-le en ligne.
Explication:
la source
R , 65 octets
Utilise le
lubridate
package. L'%m+%
opérateur infixe est le sucre de laadd_with_rollback
fonction qui implémente essentiellement ce que la question demande.TIO n'en a pas
lubridate
, vous pouvez donc l' essayer ici à la place avecf <-
ajouté à la fonction ci-dessus avec des cas de test:la source
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(nécessite une fonction hors fonction)Bash ,
150149 bytesEssayez-le en ligne!
Prend les entrées via les arguments de ligne de commande dans l'ordre: ancienne année, ancien mois, ancien jour. changement d'année, changement de mois, changement de jour. Sort une chaîne comme
Wed Feb 28 00:00:00 UTC 2018
stdout.la source
PHP , 203 octets
Pour l'exécuter:
Exemple:
Ou essayez-le en ligne!
Tests: Essayez-le en ligne!
la source
T-SQL, 53 octets
Je ne suis pas sûr que cela soit important, mais j'applique l'ajustement de l'année, suivi de l'ajustement du mois, suivi du jour. Toutes les valeurs de test sont vérifiées.
Selon nos normes d'E / S , l'entrée est tirée d'une table préexistante t avec le champ de date a et les champs entiers y , m et d .
Notez que ce n'est pas la capitalisation qui importe entre les codes de type de date ( D , M et Y ) et mes valeurs d'entrée ( d , m et y ), c'est simplement l'ordre des paramètres dans la
DATEADD
fonction SQL .la source
2001 3 1
2001 2 28