Dada três inteiros não negativos y, me 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 é yanos, mmeses e ddias 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
yao ano - Adicionar
mao 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
dao 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, me d(por exemplo, poderia dser 2147483000?)
All inputs and outputs will be within the representable integer range of your language.