Introdução: por que seu código com datas funciona "de vez em quando"?
\n\nImagine: você está escrevendo um aplicativo de calendário ou lembrete. Precisa simplesmente pegar a data atual e adicionar um dia a ela. Parece simples, não é? Você abre o Stack Overflow, encontra uma pergunta com milhares de visualizações "How do I add 1 day to an NSDate?" — e percebe que até mesmo uma operação tão simples pode se tornar um pesadelo.
\n\nNeste artigo, analisaremos os principais erros ao adicionar um dia a NSDate em Swift, aprenderemos a evitá-los e escreveremos um código correto e confiável. Você descobrirá por que a abordagem antiga com NSDate e timeInterval é um caminho para bugs e como as APIs modernas da Apple resolvem a situação.
Vamos entender de uma vez por todas como trabalhar com datas!
\n\nErro nº1: Usar timeInterval para adicionar um dia
\n\nCódigo-catástrofe
\nO erro mais comum que os iniciantes cometem:
\n\nlet today = NSDate()\nlet oneDay: TimeInterval = 24 * 60 * 60 // 86,400 segundos\nlet tomorrow = today.addingTimeInterval(oneDay)\n\nÀ primeira vista, parece lógico. Um dia tem 24 horas, uma hora tem 60 minutos, um minuto tem 60 segundos. Multiplicamos, somamos — lucro!
\n\nMas não. Isso funciona apenas em 99% dos casos, e em 1% — quebra todo o aplicativo para os usuários. Por quê?
\n\nArmadilhas
\n- \n
- Mudança para horário de verão/inverno. No dia da mudança de horário, um dia pode durar 23 ou 25 horas. Seus 86,400 segundos se transformarão em 83,400 ou 90,000. \n
- Segundos bissextos. Embora seja um caso raro, eles existem oficialmente. \n
- Fusos horários. Se o usuário estiver viajando, seu horário local pode se desregular. \n
- Precisão ao segundo. Você não está apenas adicionando "o próximo dia", mas sim adicionando exatamente 24 horas — são coisas diferentes. \n
Quer um exemplo? Em 28 de março de 2021, na Ucrânia, os relógios foram adiantados em uma hora às 3:00 da manhã. Se você adicionou timeInterval às 2:30 da manhã, não obterá 3:30, mas sim... 4:30? Ou 2:30? Depende de como o sistema processa a mudança. Resumindo, caos.
Erro nº2: Misturar NSDate e Date no mesmo projeto
\n\nEm Swift, existem dois tipos de datas: o antigo NSDate (do Objective-C) e o moderno Date (nativo do Swift). Muitos desenvolvedores, especialmente aqueles que leem tutoriais antigos ou respostas do Stack Overflow de 2014, continuam usando NSDate.
O problema é que NSDate é uma classe (reference type), enquanto Date é uma estrutura (value type). Misturá-los no código leva a:
- \n
- Bugs não óbvios com mutabilidade \n
- Conversões desnecessárias (
as Date,as NSDate) \n - Confusão na API \n
Regra: em código Swift novo, use apenas Date. Deixe NSDate para compatibilidade com bibliotecas Objective-C.
Erro nº3: Ignorar Calendar e TimeZone
\n\nAo adicionar "1 dia" a uma data, você está fazendo isso no contexto de um calendário. Sem especificar um calendário, o sistema usa Calendar.current — o calendário do usuário (geralmente gregoriano).
Mas e se o usuário da Arábia Saudita usar o calendário islâmico? Ou o japonês? Sem especificar explicitamente o calendário, você corre o risco de obter resultados inesperados.
\n\nExemplo de código incorreto
\nvar dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())\n\nEste código está quase correto, mas ele usa implicitamente o fuso horário do dispositivo. Se você estiver trabalhando com datas de servidor em UTC e o usuário estiver em Moscou (UTC+3), o "amanhã" pode chegar 3 horas antes.
\n\nSolução correta: Calendar + DateComponents
\n\nPadrão ouro para adicionar um dia
\nAqui está como adicionar corretamente 1 dia a