chrono & time
Rust possui dois ecossistemas maduros de data e hora: chrono (amplamente utilizado, rico em recursos) e time (alinhado com a biblioteca padrão, API conservadora). Escolha um por workspace e serialize com serde.
Receita
# Opção A: chrono
chrono = { version = "0.4", features = ["serde"] }
# Opção B: time
time = { version = "0.3", features = ["serde", "formatting", "parsing"] }use chrono::{DateTime, Utc};
fn now_rfc3339() -> String {
Utc::now().to_rfc3339()
}use time::{OffsetDateTime, format_description::well_known::Rfc3339};
fn now_rfc3339_time() -> time::Result<String> {
OffsetDateTime::now_utc().format(&Rfc3339)
}Quando usar isso:
- Timestamps de API em JSON
- Períodos de faturamento, TTLs, janelas de cron
- Análise de strings de data fornecidas pelo usuário
Exemplo de Trabalho
use chrono::{DateTime, Duration, Utc};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Event {
#[serde(with = "chrono::serde::ts_seconds")]
created_at: DateTime<Utc>,
}
fn expires_in(event: &Event, days: i64) -> bool {
Utc::now() > event.created_at + Duration::days(days)
}O que isso demonstra:
- Armazene UTC em serviços; converta na borda da UI
- Adaptadores Serde controlam o formato de transmissão (epoch vs RFC3339)
- Matemática de Duração para regras de negócios
Mergulho Profundo
Escolhendo chrono vs time
| Fator | chrono | time |
|---|---|---|
| Ecossistema | sqlx, muitos crates por padrão | Crescente, amigável a #![no_std] |
| Estilo da API | DateTime<Utc> | OffsetDateTime |
| Código legado | Comum em repositórios mais antigos | Preferido para novos parsers sensíveis à segurança |
RFC3339 para APIs
Prefira strings ISO-8601 em JSON para depuração humana. Use segundos epoch apenas quando a largura de banda for importante.
Armadilhas
- Fuso horário local em servidores - Bugs de horário de verão. Correção: UTC internamente;
chrono-tzoutimecom offset apenas na exibição. - Misturar chrono e time - Dor de conversão. Correção: Padrão do workspace.
- NaiveDateTime para instantes - Ambíguo. Correção: Sempre anexe o offset ou use UTC.
- Análise sem validação - Lixo silencioso. Correção: Parsers rigorosos e propagação de
Result. - Precisão sub-segundo no DB - Truncamento. Correção: Corresponder ao tipo de coluna (TIMESTAMPTZ).
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
std::time::Instant | Benchmarks, timeouts | Datas visíveis ao usuário |
humantime | Strings de duração CLI | Modelos de domínio tipados |
DB NOW() | Autoridade de persistência | Timestamps gerados pelo cliente |
FAQs
chrono está depreciado?
A manutenção continua; time é uma alternativa, não uma migração forçada.
Como serializo RFC3339?
chrono: to_rfc3339() ou serde com variantes chrono::serde::ts_seconds_option.
Timestamps em sqlx?
Use chrono::DateTime<Utc> ou time::OffsetDateTime com tipos de DB compatíveis.
Testando código dependente do tempo?
Injete um trait de clock ou passe DateTime<Utc> do chamador; evite Utc::now() codificado em lógica principal.
Relacionados
- serde - formatos de transmissão
- reqwest & sqlx - Limites de API e DB
- Melhores Práticas de Crates Essenciais
- Configuração em produção
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.