Subtrair Dias de uma Data: o caso onde "voltar um mês" e "voltar 30 dias" divergem
Subtrair dias usa a mesma técnica já documentada na página de
Somar Dias deste site
(data.setDate(data.getDate() - dias)), mas vale destacar
especificamente o caso de borda que a subtração expõe com mais
frequência que a soma: a confusão entre "voltar N dias" e "voltar N
meses" — são operações matematicamente diferentes que só coincidem
por acaso em meses de exatamente 30 dias. Subtrair 30 dias de 15 de
março não devolve 15 de fevereiro (fevereiro tem só 28 ou 29 dias) —
devolve 13 de fevereiro (ou 14, em ano bissexto), porque a operação
conta dias individuais, não "volta um mês inteiro" como unidade.
Por que voltar através de fevereiro é o caso de teste mais revelador
Testar subtração de dias especificamente atravessando fevereiro (e
especialmente entre um ano bissexto e um não-bissexto) é o caso que
mais expõe implementações incorretas — subtrair 1 dia de 1º de março
deveria retornar 29 de fevereiro em ano bissexto, mas 28 de fevereiro
em ano comum, um comportamento que só uma implementação que realmente
consulta a regra de ano bissexto (não uma tabela fixa "fevereiro tem
28 dias") consegue acertar em ambos os casos. Como
setDate() delega essa lógica ao próprio objeto Date do
JavaScript, essa distinção é tratada corretamente sem código adicional
específico para esse caso de borda.
Uso prático: contar prazo retroativo e período de carência
Subtrair dias de uma data aparece em cálculos como determinar a data limite retroativa de um período de carência (por exemplo, "documentos dos últimos 90 dias"), calcular a data de início de um período de apuração contábil ou fiscal que termina numa data conhecida, ou verificar se uma data de nascimento cai dentro de uma janela de elegibilidade contada retroativamente a partir de hoje — em todos esses casos, contar dias individuais corretamente (não aproximar por "meses de 30 dias") é o que garante que o resultado bata exatamente com o prazo legal ou contratual real, sem margem de erro de um ou dois dias que uma aproximação grosseira introduziria.