Introdução ao trabalho com datas e horas em Rust
Trabalhar com datas e horas é uma das tarefas essenciais em qualquer aplicação moderna. Seja para registro de eventos, agendamento de tarefas, processamento de dados do usuário ou trabalho com APIs — não é possível prescindir do gerenciamento correto de timestamps. Na linguagem Rust, conhecida por seu desempenho e segurança, a biblioteca padrão fornece apenas um conjunto mínimo de ferramentas para trabalhar com tempo. No entanto, vem em auxílio a poderosa crate chrono, que se tornou o padrão de facto para trabalhar com datas e horas no ecossistema Rust.
Neste artigo, vamos detalhar como instalar e usar chrono, como criar, formatar, fazer parsing e manipular datas, bem como trabalhar com fusos horários e timestamps Unix.
Instalação e inclusão da crate chrono
Para começar, é necessário adicionar a dependência chrono no arquivo Cargo.toml do seu projeto:
[dependencies]chrono = "0.4"Depois disso, você pode importar os tipos e traits necessários no código:
use chrono::{DateTime, Utc, Local, NaiveDate, NaiveDateTime, Duration, Datelike, Timelike, TimeZone};A crate chrono oferece vários tipos chave para representar datas e horas:
NaiveDate— data sem hora e fuso horário (exemplo: 2024-01-15).NaiveTime— hora sem data e fuso horário (exemplo: 14:30:00).NaiveDateTime— combinação de data e hora sem considerar fuso horário.DateTime<Utc>— data e hora com fuso horário UTC.DateTime<Local>— data e hora com o fuso horário local do sistema.DateTime<FixedOffset>— data e hora com um deslocamento arbitrário do UTC.
Criação e obtenção da hora atual
A maneira mais simples de obter o momento atual é usar as funções Utc::now() e Local::now():
use chrono::{Utc, Local};
fn main() { let utc_now: DateTime<Utc> = Utc::now(); let local_now: DateTime<Local> = Local::now(); println!("Hora atual UTC: {}", utc_now); println!("Hora local atual: {}", local_now);}Para criar uma data específica, você pode usar os métodos NaiveDate::from_ymd e NaiveDateTime::new:
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
fn main() { // Criando a data 15 de março de 2024 let date = NaiveDate::from_ymd(2024, 3, 15); println!("Data: {}", date); // Criando a hora 10:30:00 let time = NaiveTime::from_hms(10, 30, 0); println!("Hora: {}", time); // Combinação de data e hora let datetime = NaiveDateTime::new(date, time); println!("Data e hora: {}", datetime);}Você também pode criar uma data com fuso horário usando o método and_hms da data:
use chrono::{Utc, TimeZone};
fn main() { let datetime_utc = Utc.ymd(2024, 12, 25).and_hms(12, 0, 0); println!("Natal UTC: {}", datetime_utc);}Formatação e parsing de datas
Formatação de saída
Para converter uma data em string, usa-se o método format, que aceita uma string de formato. Os especificadores de formato são análogos aos da linguagem Python e outras linguagens:
use chrono::{Utc, DateTime};
fn main() { let now = Utc::now(); // Formatação básica println!("Padrão: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("Apenas data: {}", now.format("%d.%m.%Y")); println!("Com nome do mês: {}", now.format("%d %B %Y")); println!("Hora com segundos: {}", now.format("%H:%M:%S")); println!("Unix timestamp: {}", now.timestamp());}