Como adicionar 1 dia a NSDate: 5 erros fatais de iniciante em Swift

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que seu código com datas funciona "de vez em quando"?

\n\n

Imagine: 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\n

Neste 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.

\n\n

Vamos entender de uma vez por todas como trabalhar com datas!

\n\n

Erro nº1: Usar timeInterval para adicionar um dia

\n\n

Código-catástrofe

\n

O erro mais comum que os iniciantes cometem:

\n\n
let 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\n

Mas não. Isso funciona apenas em 99% dos casos, e em 1% — quebra todo o aplicativo para os usuários. Por quê?

\n\n

Armadilhas

\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
\n\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.

\n\n

Erro nº2: Misturar NSDate e Date no mesmo projeto

\n\n

Em 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.

\n\n

O problema é que NSDate é uma classe (reference type), enquanto Date é uma estrutura (value type). Misturá-los no código leva a:

\n
    \n
  • Bugs não óbvios com mutabilidade
  • \n
  • Conversões desnecessárias (as Date, as NSDate)
  • \n
  • Confusão na API
  • \n
\n\n

Regra: em código Swift novo, use apenas Date. Deixe NSDate para compatibilidade com bibliotecas Objective-C.

\n\n

Erro nº3: Ignorar Calendar e TimeZone

\n\n

Ao 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).

\n\n

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\n

Exemplo de código incorreto

\n
var dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())
\n\n

Este 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\n

Solução correta: Calendar + DateComponents

\n\n

Padrão ouro para adicionar um dia

\n

Aqui está como adicionar corretamente 1 dia a

Blogs

Book Recommendations