Trabalhando com datas e horas em Rust: guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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, Utc ou Local).


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};                

Blogs

Book Recommendations