Dada três inteiros não negativos y
, m
e d
(dos quais pelo menos um deve ser positivo) e uma data válida com um ano positivo (em qualquer formato razoável, que inclui o ano, mês e dia, e nenhuma informação adicional), a saída do data que é y
anos, m
meses e d
dias após a data original.
O calendário gregoriano deve ser usado para todas as datas (mesmo datas anteriores à adoção do calendário gregoriano).
O método para calcular a próxima data é o seguinte:
- Adicionar
y
ao ano - Adicionar
m
ao mês - Normalize a data aplicando rollovers (por exemplo,
2018-13-01
->2019-01-01
) - Se o dia tiver passado o último dia do mês, altere-o para o último dia do mês (por exemplo,
2018-02-30
->2018-02-28
) - Adicionar
d
ao dia - Normalize a data aplicando rollovers (por exemplo,
2019-01-32
->2019-02-01
)
Os anos bissextos (anos divisíveis por 4, mas não divisíveis por 100, a menos que também divisíveis por 400) devem ser tratados adequadamente. Todas as entradas e saídas estarão dentro do intervalo inteiro representável do seu idioma.
Casos de teste
Os casos de teste são fornecidos no formato input => output
, onde input
é um objeto 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
Você pode usar este JSFiddle para teste.
Isso é código-golfe , então a solução mais curta (em cada idioma) vence.
y
, m
e d
(por exemplo, poderia d
ser 2147483000?)
All inputs and outputs will be within the representable integer range of your language.