Trabalho com datas em Rust: visão geral das principais bibliotecas
O ecossistema Rust oferece várias bibliotecas poderosas para trabalhar com datas e horas. Ao contrário do Python com seu módulo embutido datetime, em Rust a biblioteca padrão fornece apenas funcionalidade mínima (std::time::Instant e Duration), portanto, para tarefas sérias, é necessário recorrer a crates externos. Neste artigo, vamos examinar três bibliotecas principais: Chrono, Time e Jiff.
1. Chrono — o padrão de facto
Chrono é a biblioteca mais popular (mais de 100 milhões de downloads). Ela fornece um conjunto completo de ferramentas para trabalhar com datas, horas, fusos horários e formatação.
Principais recursos:
NaiveDate,NaiveDateTime— datas e horas sem fuso horárioDateTime<Tz>— data-hora com vínculo a um fuso horário- Suporte para
Duratione operações aritméticas - Formatação através de
format!e parsing de strings - Trabalho com calendários (Gregoriano, ISO)
Exemplo de código:
use chrono::{DateTime, Utc, NaiveDate, Duration};
fn main() { // Hora atual em UTC let now: DateTime<Utc> = Utc::now(); println!("Hora atual: {}", now.format("%Y-%m-%d %H:%M:%S"));
// Criando uma data específica let date = NaiveDate::from_ymd_opt(2025, 3, 15).unwrap(); println!("Data: {}", date);
// Aritmética com datas let future = now + Duration::days(30); println!("Daqui a 30 dias: {}", future.format("%d.%m.%Y"));
// Parsing de string let parsed = "2025-01-01 12:00:00" .parse::<DateTime<Utc>>() .expect("Formato de data inválido"); println!("Parseado: {}", parsed);}Chrono é excelente para a maioria dos projetos, mas pode ser excessivo se apenas a funcionalidade básica for necessária.
2. Time — alternativa moderna
O crate Time (desenvolvedor Jacob Pratt) se posiciona como uma substituição mais segura e ergonômica para Chrono. Ele usa tipagem estrita e evita panics em tempo de execução.
Principais diferenças:
- Todas as operações retornam
Result— sem panics ocultos - Sistema de tipos mais rigoroso: tipos separados para datas, horas, offsets
- Suporte embutido para ISO 8601 e RFC 3339
- Tamanho menor e compilação mais rápida
Exemplo de código:
use time::{Date, Month, OffsetDateTime, Duration, format_description};
fn main() -> Result<(), time::Error> { // Hora atual let now = OffsetDateTime::now_utc(); println!("Agora: {}", now);
// Criando data (sem panic) let date = Date::from_calendar_date(2025, Month::March, 15)?; println!("Data: {}", date);
// Aritmética let week_later = now + Duration::weeks(1); println!("Daqui a uma semana: {}", week_later);
// Parsing com formato explícito let format = format_description::parse("[year]-[month]-[day]")?; let parsed = Date::parse("2025-12-31", &format)?; println!("Parseado: {}", parsed); Ok(())}Time é uma excelente escolha para novos projetos onde segurança e previsibilidade são importantes.
3. Jiff — o mais novo player
Jiff (de BurntSushi, criador do regex e ripgrep) é a biblioteca mais recente (lançamento em 2024). Ela foca no trabalho com fusos horários e internacionalização.
Características:
- Base de dados de fusos horários embutida (IANA)
- Suporte para calendários não padrão (Islâmico, Judaico, etc.)
- Trabalho avançado com intervalos e períodos
- Alta performance devido a cálculos lazy
Exemplo de código:
```Também na biblioteca
Flyway para Java: guia completo com exemplos
Aprendizado de Máquina em Swift: Core ML, Create ML, TensorFlow Swift e Turi Create
GraphQL em C++: biblioteca cppgraphqlgen para criação de APIs