Duration în Rust

O durată de timp (secunde și nanosecunde), creată cu from_secs, from_millis; se poate aduna, înmulți și compara.

Sintaxă
use std::time::Duration;

const fn from_secs(secs: u64) -> Duration
const fn from_millis(millis: u64) -> Duration
const fn new(secs: u64, nanos: u32) -> Duration

Ce face Duration

Duration reprezintă un interval de timp, mereu pozitiv, cu precizie de nanosecundă. Îl creezi cu Duration::from_secs(90), Duration::from_millis(1500), from_micros, from_nanos, from_secs_f64(2.5) sau Duration::new(secunde, nanosecunde).

Duratele se adună, se scad, se înmulțesc și se împart cu numere întregi (d * 3, d / 2) și se compară. Cu {:?} sunt afișate într-o formă ușor de citit (1.5s, 250ms). Scăderea care ar da rezultat negativ intră în panică; folosește checked_sub sau saturating_sub.

Funcțiile din std care așteaptă un timp (thread::sleep, recv_timeout, limitele de timp ale socket-urilor) primesc Duration.

Parametri

Parametru Descriere
secs Numărul de secunde.
millis Numărul de milisecunde.

Ce returnează

O Duration.

Exemple

Exemplul 1: Creare, afișare și calcule

use std::time::Duration;

fn main() {
    let pauza = Duration::from_secs(90);
    let pas = Duration::from_millis(1500);
    let precis = Duration::new(2, 250_000_000);

    println!("{pauza:?}, {pas:?}, {precis:?}");
    println!("sumă: {:?}", pauza + pas);
    println!("de 4 ori: {:?}", pas * 4);
    println!("jumătate: {:?}", pauza / 2);
    println!("pas < precis: {}", pas < precis);
    println!("from_secs_f64(0.75): {:?}", Duration::from_secs_f64(0.75));
}

Rezultat

90s, 1.5s, 2.25s
sumă: 91.5s
de 4 ori: 6s
jumătate: 45s
pas < precis: true
from_secs_f64(0.75): 750ms

Exemplul 2: Durata totală a unui playlist

Adunăm durate cu sum() și transformăm totalul în minute și secunde.

use std::time::Duration;

fn main() {
    let melodii = [("Ciocârlia", 185), ("Hora unirii", 142), ("Doina", 263)];
    let total: Duration = melodii.iter().map(|(_, s)| Duration::from_secs(*s)).sum();

    let secunde = total.as_secs();
    println!("{} melodii, {} min {} s", melodii.len(), secunde / 60, secunde % 60);

    let ramas = total.checked_sub(Duration::from_secs(1000));
    println!("mai rămân din 1000 s: {:?}", ramas);
    println!("saturating: {:?}", Duration::from_secs(10).saturating_sub(total));
}

Rezultat

3 melodii, 9 min 50 s
mai rămân din 1000 s: None
saturating: 0ns

Greșeli frecvente

  • Scrii Duration::from_secs(0.5): nu compilează, pentru că primește u64. Folosește from_millis(500) sau from_secs_f64(0.5).
  • Scazi o durată mai mare dintr-una mai mică: panică overflow when subtracting durations. Folosește checked_sub sau saturating_sub.

Comenzi înrudite

  • Duration::as_secs: Transformă o durată în număr: secunde întregi (as_secs), milisecunde (as_millis) sau secunde cu zecimale (as_secs_f64).
  • Instant: Un moment de timp măsurat de un ceas care doar crește; folosit pentru a măsura cât durează o operație.
  • thread::sleep: Oprește firul curent cel puțin cât durata dată; celelalte fire continuă să ruleze.
  • SystemTime: Ora sistemului (ceasul din calendar); diferența față de UNIX_EPOCH dă timestamp-ul Unix în secunde.