Trabalhando com datas e horas em Rust: do A ao Z
Trabalhar com datas e horas é uma das tarefas essenciais no desenvolvimento de qualquer aplicação: desde serviços web até sistemas de logging. No Rust, conhecido por sua segurança e desempenho, o trabalho com datas é implementado através da poderosa biblioteca chrono. Neste artigo, abordaremos todos os aspectos de trabalhar com datas e horas: desde operações básicas até manipulações complexas com fusos horários.
1. Instalação e configuração da biblioteca chrono
A biblioteca chrono é o padrão de facto para trabalhar com datas e horas em Rust. Ela fornece um conjunto completo de ferramentas: desde objetos de data simples até tipos complexos com suporte a fusos horários.
Para começar, adicione a dependência no arquivo Cargo.toml:
[dependencies]chrono = "0.4"Depois disso, importe os módulos necessários no seu código:
use chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local, Duration};use chrono::format::ParseError;2. Tipos de dados principais para trabalhar com datas
No chrono, existem vários tipos-chave que cobrem todas as necessidades do desenvolvedor:
NaiveDate— data sem hora e fuso horário (por exemplo, 2024-01-15).NaiveTime— hora sem data e fuso horário (por exemplo, 14:30:00).NaiveDateTime— combinação de data e hora sem fuso horário.DateTime<Tz>— data e hora com indicação de fuso horário (por exemplo,DateTime<Utc>ouDateTime<Local>).
Vamos ver um exemplo de criação de objetos de cada tipo:
// Criando NaiveDatelet date = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();println!("Data: {}", date); // 2024-01-15
// Criando NaiveTimelet time = NaiveTime::from_hms_opt(14, 30, 0).unwrap();println!("Hora: {}", time); // 14:30:00
// Criando NaiveDateTimelet datetime = NaiveDateTime::new(date, time);println!("Data e hora: {}", datetime); // 2024-01-15 14:30:00
// Criando DateTime com fuso horário UTClet utc_datetime = Utc::now();println!("Hora atual UTC: {}", utc_datetime);
// Criando DateTime com fuso horário locallet local_datetime = Local::now();println!("Hora local atual: {}", local_datetime);3. Formatação e parsing de datas
Uma das tarefas mais comuns é converter datas em strings e vice-versa. O chrono usa strings de formato semelhantes ao strftime do C.
Formatando data em string
Para formatar, use o método .format():
use chrono::Utc;
let now = Utc::now();
// Formato padrão ISO 8601println!("ISO 8601: {}", now.format("%Y-%m-%dT%H:%M:%S%z"));
// Formato em portuguêsprintln!("Formato português: {}", now.format("%d.%m.%Y %H:%M"));
// Apenas dataprintln!("Apenas data: {}", now.format("%A, %d %B %Y"));
// Saída:// ISO 8601: 2024-01-15T14:30:00+0000// Formato português: 15.01.2024 14:30// Apenas data: Monday, 15 January 2024Principais especificadores de formato:
%Y— ano (4 dígitos)%m— mês (01-12)%d— dia (01-31)%H— horas (00-23)%M— minutos (00-59)%S— segundos (00-59)%z— deslocamento do fuso horário%A— nome completo do dia da semana%B— nome completo do mês
Parsing de string para data
Para converter uma string em data, use o método parse_from_str():
use chrono::NaiveDate;use chrono::format::ParseError;
fn parse_date(dat