Introdução ao trabalho com datas e horas em Rust
Trabalhar com datas e horas é uma das tarefas essenciais na maioria das aplicações modernas. Seja para registro de eventos, cálculo de prazos, processamento de timestamps de APIs ou trabalho com calendários — não há como prescindir de uma biblioteca de qualidade para lidar com tempo. No ecossistema Rust, a biblioteca padrão oferece apenas funcionalidades básicas (std::time::Instant e std::time::Duration), que são adequadas para medição de desempenho, mas não para trabalho completo com datas de calendário.
É aí que entra a crate chrono — o padrão de facto para trabalhar com datas e horas em Rust. Ela oferece uma ampla gama de funcionalidades: desde a criação de datas simples até o trabalho com fusos horários, formatação e aritmética. Neste artigo, vamos detalhar os principais recursos do chrono, fornecer exemplos práticos e mostrar como evitar erros comuns.
1. Instalação e tipos principais do chrono
Para começar, adicione a dependência ao seu Cargo.toml:
[dependencies]chrono = "0.4"Depois disso, você pode importar os tipos necessários. O Chrono oferece três tipos principais para representar datas e horas:
NaiveDate— data sem hora (ano, mês, dia).NaiveDateTime— data e hora sem considerar fuso horário.DateTime<Tz>— data e hora vinculadas a um fuso horário (por exemplo,UtcouLocal).
Vejamos um exemplo simples de criação desses tipos:
use chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local};
fn main() { // Criando uma data ingênua (sem hora) let date = NaiveDate::from_ymd_opt(2025, 10, 15).unwrap(); println!("Data: {}", date);
// Criando uma hora ingênua (sem data) let time = NaiveTime::from_hms_opt(14, 30, 0).unwrap(); println!("Hora: {}", time);
// Combinando em NaiveDateTime let naive_dt = NaiveDateTime::new(date, time); println!("Naive datetime: {}", naive_dt);
// Hora atual em UTC e local let now_utc: DateTime<Utc> = Utc::now(); let now_local: DateTime<Local> = Local::now(); println!("Agora UTC: {}", now_utc); println!("Agora local: {}", now_local);}Observe o uso de from_ymd_opt e from_hms_opt — eles retornam Option, o que protege contra a criação de datas inválidas (por exemplo, 32 de janeiro).
2. Formatação e parsing de datas
O Chrono utiliza um poderoso sistema de formatação baseado em especificadores, muito semelhante ao strftime do C/PHP. Isso permite converter datas em strings e vice-versa de forma flexível.
2.1 Formatação de data em string
use chrono::{Utc, DateTime};
fn main() { let now: DateTime<Utc> = Utc::now(); // ISO 8601 padrão println!("ISO: {}", now.to_rfc3339()); // Formato personalizado println!("Personalizado: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("Dia da semana: {}", now.format("%A")); println!("Mês: {}", now.format("%B")); println!("Ano-mês-dia: {}", now.format("%d.%m.%Y"));}Principais especificadores de formatação:
%Y— ano (4 dígitos)%m— mês (01-12)%d— dia do mês (01-31)%H— horas (00-23)%M— minutos (00-59)%S— segundos (00-60)%A— nome completo do dia da semana%B— nome completo do mês
2.2 Parsing de string para data
Para a conversão inversa, utiliza-se o método parse_from_str:
use chrono::{NaiveDateTime, DateTime, Utc, format::ParseResult};