Executando verificação de segurança...
5

Realmente, isso não é algo tão trivial assim. Acredito que todo mundo tenha passado por uma etapa da infância onde perguntou para alguém mais velho: "E quem nasce dia 29 de fevereiro, faz aniversário quando?".

(...) qual deve ser o resultado?
A resposta certa é que "ninguém sabe ao certo".

Concordo. Eu acredito que isso varia muito de contexto para contexto. Se eu precisasse implementar uma "soma de mês", perguntaria "para que você precisa disso?". Acho que minha ficha caiu para essa necessidade quando precisei lidar com algo parecido, quando ainda estava aprendendo JavaScript, e vi que a biblioteca Moment.js tinha duas funções especiais, startOf e endOf, para obter o começo ou fim de um período (mês, por exemplo).

Ótimo artigo.

Carregando publicação patrocinada...
4

"E quem nasce dia 29 de fevereiro, faz aniversário quando?"

Conheço gente que nasceu em 29/02 e em anos não-bissextos comemoram em 1 de março - já que dia 28 é "antes", e "comemorar antes dá azar" :-)

Apesar de parecer bobo, isso pode ter implicações em sistemas e situações mais sérias. Se não me engano (carece de fontes), juridicamente considera-se 1 de março caso o ano não seja bissexto (ou seja, se alguém nasceu em 29/02/2020, será considerado maior de idade somente a partir de 01/03/2038). Imagine as consequências de uma implementação errada em um sistema que fosse verificar a idade para esses casos (ou em qualquer sistema que tenha restrições de idade).

Também já vi isso dar problema em outros tipos de sistemas. Por exemplo, tinha um job que deveria rodar sempre no último dia do mês, e claro que quando chegou 29/02 não rodou (pois já havia rodado no dia 28). Ou o clássico "mandar email no aniversário do cliente", que ignorava quem nasceu em 29/02.

Os problemas de somar 1 mês costumam aparecer também quando precisa gerar recorrência (por exemplo, data de vencimento de parcelas). Sempre precisa decidir o que fazer quando a data cai nos últimos dias do mês. E pra variar, a resposta sempre é "depende".