Trabalhando com Datas e Horários em Swift: do Básico às Técnicas Avançadas
Trabalhar com datas e horários é uma das tarefas essenciais no desenvolvimento de aplicativos para iOS e macOS. O Swift fornece um conjunto poderoso e flexível de ferramentas para esse fim: Date, DateFormatter, Calendar, DateComponents e TimeInterval. Neste artigo, vamos detalhar cada um deles, mostrar exemplos práticos e aprender a resolver tarefas típicas, como formatação de datas, cálculo de diferenças de tempo, trabalho com fusos horários e calendários.
1. Fundamentos: a classe Date e TimeInterval
O tipo básico para representar um momento no tempo é Date. Ele armazena o número de segundos desde 1º de janeiro de 2001, 00:00:00 UTC (data de referência da Apple).
Criação e comparação de datas:
import Foundation
// Data e hora atuaislet now = Date()print("Agora: \\(now)")
// Data baseada em um intervalo de tempo (120 segundos a partir do momento atual)let futureDate = Date(timeIntervalSinceNow: 120)print("Daqui a 2 minutos: \\(futureDate)")
// Data baseada em um intervalo fixo a partir da data de referêncialet specificDate = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 365) // 1 ano a partir de 2001print("Data aproximada: \\(specificDate)")
// Comparação de datasif now < futureDate { print("A data atual é anterior à data futura")}TimeInterval é simplesmente um apelido para Double, representando o número de segundos. Ele é usado para calcular a diferença entre datas:
let startDate = Date()sleep(2) // Simulação de atrasolet endDate = Date()
let elapsed: TimeInterval = endDate.timeIntervalSince(startDate)print("Passaram \\(elapsed) segundos") // Exibirá ~2.0
// Operação inversalet minutes: TimeInterval = 5 * 60let fiveMinutesLater = Date(timeInterval: minutes, since: startDate)2. Formatação de Datas com DateFormatter
Para exibir a data ao usuário de forma compreensível, usa-se DateFormatter. Ele suporta localização e vários estilos.
Formatação básica:
let formatter = DateFormatter()formatter.locale = Locale(identifier: "pt_BR") // Localidade brasileiraformatter.timeZone = TimeZone.current // Fuso horário atual
// Estilos padrãoformatter.dateStyle = .fullformatter.timeStyle = .shortprint(formatter.string(from: Date())) // Exemplo: "sexta-feira, 24 de fevereiro de 2025, 14:30"
formatter.dateStyle = .mediumformatter.timeStyle = .noneprint(formatter.string(from: Date())) // "24 de fev. de 2025"Formato personalizado:
formatter.dateFormat = "dd/MM/yyyy HH:mm"print(formatter.string(from: Date())) // "24/02/2025 14:30"
// Análise de string para datalet dateString = "25/12/2024 10:00"if let parsedDate = formatter.date(from: dateString) { print("Data analisada: \\(parsedDate)")}Importante: Ao analisar, sempre verifique se date(from:) não retorna nil. O formato incorreto da string ou incompatibilidade de localidade resultará em erro.
3. Cálculos de Calendário: Calendar e DateComponents
A classe Calendar encapsula informações sobre o sistema de calendário (gregoriano, islâmico, budista, etc.) e permite realizar operações complexas com datas. DateComponents é usado para descrever componentes individuais de uma data (ano, mês, dia, hora, etc.).
Extração de componentes:
let calendar = Calendar.currentlet components = calendar.dateComponents([.year, .month, .day, .weekday], from: Date())
print("Ano: \\(components.year!)")print("Mês: \\(components.month!)")print("Dia: \\(components.day!)")print("Dia da semana: \\(components.weekday!)") // 1 - domingo, 2 - segunda-feira...