Rust Snippets

Trechos de timestamp Unix em Rust

Exemplos de Rust para segundos e milissegundos Unix atuais, formatação baseada em chrono e conversão de valores epoch em strings UTC legíveis.

Current Unix timestamp (seconds)
use std::time::{SystemTime, UNIX_EPOCH};

let ts = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .unwrap()
    .as_secs();
Current Unix timestamp (milliseconds)
use std::time::{SystemTime, UNIX_EPOCH};

let ms = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .unwrap()
    .as_millis();
With the chrono crate
// Cargo.toml: chrono = "0.4"
use chrono::Utc;

Utc::now().timestamp()         // seconds
Utc::now().timestamp_millis()  // milliseconds
Format with chrono
use chrono::{DateTime, TimeZone, Utc};

let dt: DateTime<Utc> = Utc.timestamp_opt(1700000000, 0).unwrap();
println!("{}", dt.to_rfc3339());
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));

Noções básicas de marcas de tempo em Rust

A biblioteca padrão expõe SystemTime e UNIX_EPOCH para cálculos de marcas de tempo sem dependências. duration_since(UNIX_EPOCH) pode ser lido como segundos, milissegundos, microssegundos ou nanossegundos.

Formatando marcas de tempo em Rust

Para datas legíveis, muitos projetos Rust usam a crate chrono. Converta os segundos epoch em um DateTime UTC e depois formate como RFC3339 ou uma string personalizada para logs e interfaces de usuário.

Notas de produção para Rust

A biblioteca padrão do Rust basta para medir durações e ler tempo Unix, enquanto crates como chrono ou time são melhores para formatação de calendário. Mantenha a conversão falível perto do tratamento da entrada, porque marcas de tempo externas podem ser negativas, grandes demais ou expressas na unidade errada.

  • Use as_secs() para segundos Unix padrão a partir de SystemTime
  • Use as_millis() para marcas de tempo compatíveis com JavaScript
  • Use chrono ou time quando precisar de análise, formatação com fuso ou saída RFC3339
  • Valide a unidade das marcas de tempo externas antes de armazená-las em structs tipadas

FAQ

O SystemTime consegue lidar com datas anteriores a 1970?
O SystemTime pode representar instantes em torno do epoch Unix, mas duration_since(UNIX_EPOCH) retorna um erro para instantes anteriores. Trate esse caso se marcas de tempo externas puderem ser negativas.
Preciso do chrono para toda marca de tempo?
Não. A biblioteca padrão basta para segundos e milissegundos Unix atuais. Use chrono ou time quando precisar de análise, formatação ou lógica de calendário.
Como verifico as unidades de marca de tempo em Rust?
Converta um valor de amostra para RFC3339 com chrono ou time, depois confirme que corresponde ao contrato da API ou do banco de dados antes de aceitar o campo como segundos ou milissegundos.