Trabalhando com datas em Rust: visão geral das principais bibliotecas
Rust é uma linguagem de programação de sistema que dá grande ênfase à segurança e ao desempenho. No entanto, trabalhar com datas e horas é sempre uma tarefa complexa devido a fusos horários, segundos bissextos e formatos. No ecossistema Rust, existem várias bibliotecas maduras que resolvem esses problemas. Neste artigo, vamos analisar três bibliotecas principais: chrono, time e jiff, além de mostrar como usá-las na prática.
1. Chrono — o padrão principal
chrono é a biblioteca mais popular para trabalhar com datas em Rust. Ela fornece um conjunto completo de ferramentas: parsing, formatação, aritmética de datas, trabalho com fusos horários e serialização via serde.
Instalação via Cargo.toml:
[dependencies]chrono = { version = "0.4", features = ["serde"] }Exemplo de uso básico:
use chrono::{NaiveDate, NaiveDateTime, Duration, Utc, Local};
fn main() { // Data e hora atuais em UTC let utc_now = Utc::now(); println!("Agora em UTC: {}", utc_now.format("%Y-%m-%d %H:%M:%S"));
// Hora local let local_now = Local::now(); println!("Hora local: {}", local_now.format("%d.%m.%Y %H:%M"));
// Criando uma data específica let date = NaiveDate::from_ymd_opt(2025, 3, 14).unwrap(); println!("Data: {}", date);
// Aritmética de datas let next_week = date + Duration::days(7); println!("Daqui a uma semana: {}", next_week);
// Parsing de string let parsed = NaiveDateTime::parse_from_str( "2025-12-31 23:59:59", "%Y-%m-%d %H:%M:%S" ).unwrap(); println!("Parseado: {}", parsed);}2. Biblioteca Time — alternativa moderna
time é uma biblioteca mais nova e rigorosa, desenvolvida considerando os erros do chrono. Ela oferece uma separação clara entre os tipos: Date, Time, OffsetDateTime e PrimitiveDateTime. Suporta macros para criação conveniente de datas.
Instalação:
[dependencies]time = { version = "0.3", features = ["macros", "serde"] }Exemplos:
use time::{Date, Time, OffsetDateTime, macros::datetime, Duration};
fn main() { // Hora atual let now = OffsetDateTime::now_utc(); println!("Agora: {}", now);
// Criando data via macro let meeting = datetime!(2025-06-15 14:30:00 +03:00); println!("Reunião: {}", meeting);
// Extraindo componentes let date = meeting.date(); let time = meeting.time(); println!("Data: {}, Hora: {}", date, time);
// Calculando diferença let deadline = datetime!(2025-12-31 00:00:00 UTC); let diff = deadline - now; println!("Até o prazo: {} dias", diff.whole_days());
// Formatação let formatted = now.format( &time::format_description::well_known::Rfc3339 ).unwrap(); println!("RFC 3339: {}", formatted);}Importante: A biblioteca time faz parte da organização oficial do Rust e é considerada mais segura, pois evita pânicos na maioria dos métodos (usa Result).
3. Jiff — a nova estrela
jiff é uma biblioteca relativamente nova que foca em ergonomia e desempenho. Sua principal característica é a detecção automática de fuso horário e suporte integrado a calendários (Gregoriano, Islâmico, Judaico).
Instalação:
[dependencies]jiff = "0.1"Exemplo de uso:
use jiff::{Zoned, Timestamp, Unit};
fn main() { // Hora atual com fuso horário let now = Zoned::now(); println!("Hora atual: {}", now);
// Criando a partir de timestamp let ts = Timestamp::new(1_700_000_000, 0