Trabalho com datas em Rust: bibliotecas para tempo e calendário
Rust é uma linguagem de programação de sistema moderna que oferece tipagem estrita e segurança de memória. No entanto, a biblioteca padrão do Rust fornece apenas recursos mínimos para trabalhar com datas e horas. Para um trabalho completo com calendários, fusos horários, formatação e cálculos, os desenvolvedores usam crates de terceiros. Neste artigo, analisaremos detalhadamente três bibliotecas principais: chrono, time e jiff, além de fornecer exemplos práticos.
1. Biblioteca chrono — o padrão de facto
chrono é a biblioteca mais popular para trabalhar com datas em Rust. Ela fornece uma API rica para criação, manipulação e formatação de datas e horas. Os tipos principais são: NaiveDate, NaiveDateTime, DateTime (considerando o fuso horário) e Duration.
Instalação
# Cargo.toml[dependencies]chrono = "0.4"Exemplo: data e hora atuais
use chrono::{Local, Utc};
fn main() { let now_utc = Utc::now(); let now_local = Local::now(); println!("UTC: {}", now_utc); println!("Local: {}", now_local);}Exemplo: análise de string e formatação
use chrono::NaiveDate;
fn main() { let date = NaiveDate::parse_from_str("2025-03-15", "%Y-%m-%d") .expect("Formato de data inválido"); println!("Dia: {}", date.format("%d.%m.%Y"));}Vantagens: comunidade enorme, suporte a fusos horários via chrono-tz, trabalho com intervalos e durações.
Desvantagens: tamanho relativamente grande, complexidade ao trabalhar com calendários não padrão.
2. Biblioteca time — alternativa leve
time é uma biblioteca mais moderna e leve que está em desenvolvimento ativo. Ela usa um sistema de tipos rigoroso para prevenir erros (por exemplo, separação entre Date, Time, OffsetDateTime e PrimitiveDateTime).
Instalação
[dependencies]time = "0.3"Exemplo: criação de data e cálculo de diferença
use time::{Date, Month, Duration};
fn main() { let start = Date::from_calendar_date(2025, Month::March, 10).unwrap(); let end = Date::from_calendar_date(2025, Month::March, 20).unwrap(); let diff = end - start; println!("Diferença: {} dias", diff.whole_days());}Exemplo: formatação
use time::OffsetDateTime;use time::format_description::well_known::Rfc3339;
fn main() { let now = OffsetDateTime::now_utc(); let formatted = now.format(&Rfc3339).unwrap(); println!("RFC 3339: {}", formatted);}Vantagens: tamanho pequeno, separação clara de tipos, documentação excelente.
Desvantagens: menos exemplos na internet do que chrono.
3. Biblioteca jiff — para intervalos de alta precisão
jiff é uma biblioteca especializada para trabalhar com intervalos de calendário e eventos recorrentes. Ela é útil para tarefas de agendamento, lembretes e cálculo de dias úteis.
Instalação
[dependencies]jiff = "0.1"Exemplo: criação de intervalo e verificação de pertencimento
use jiff::ZonedInterval;use jiff::tz::TimeZone;
fn main() { let tz = TimeZone::get("Europe/Moscow").unwrap(); let start = tz.to_zoned(2025, 3, 1, 0, 0, 0, 0).unwrap(); let end = tz.to_zoned(2025, 3, 31, 23, 59, 59, 0).unwrap(); let interval = ZonedInterval::new(start, end); let check = tz.to_zoned(2025, 3, 15, 12, 0, 0, 0).unwrap(); println!("O dia 15 de março está no intervalo? {}", interval.contains(&check));}Vantagens: conveniente para calend
Também na biblioteca
Criptografia em Node.js: criptografia e hash com crypto
Actix-web para Rust: guia completo com exemplos
Validação de dados em Swift (iOS/macOS): melhores práticas e ferramentas
Java Management Extensions (JMX) — monitoramento de aplicações Java
Agendador de tarefas em TypeScript: biblioteca node-schedule