Duration::as_secs în Rust

Timp: Instant, Duration, SystemTime Rust 1.3 (as_millis: 1.33, as_secs_f64: 1.38)

Transformă o durată în număr: secunde întregi (as_secs), milisecunde (as_millis) sau secunde cu zecimale (as_secs_f64).

Sintaxă
const fn as_secs(&self) -> u64
const fn as_millis(&self) -> u128
fn as_secs_f64(&self) -> f64

Ce face Duration::as_secs

as_secs() returnează numărul de secunde întregi: partea fracționară este tăiată, nu rotunjită (1.9 s dă 1). as_millis() dă tot intervalul în milisecunde, ca u128; există și as_micros(), as_nanos(). as_secs_f64() dă secundele ca număr zecimal.

Pentru doar partea de sub o secundă există subsec_millis(), subsec_micros() și subsec_nanos(). Pentru afișări pentru oameni, {:?} sau {:.2?} sunt de obicei suficiente.

Ce returnează

as_secs: u64. as_millis: u128. as_secs_f64: f64.

Exemple

Exemplul 1: Aceeași durată, în unități diferite

use std::time::Duration;

fn main() {
    let d = Duration::from_millis(1950);
    println!("as_secs:       {}", d.as_secs());
    println!("as_millis:     {}", d.as_millis());
    println!("as_micros:     {}", d.as_micros());
    println!("as_secs_f64:   {}", d.as_secs_f64());
    println!("subsec_millis: {}", d.subsec_millis());
    println!("Debug rotunjit: {:.1?}", d);
}

Rezultat

as_secs:       1
as_millis:     1950
as_micros:     1950000
as_secs_f64:   1.95
subsec_millis: 950
Debug rotunjit: 2.0s

Exemplul 2: Ore, minute și secunde

Formatăm durata unui film sau a unei curse ca hh:mm:ss.

use std::time::Duration;

fn format_hms(d: Duration) -> String {
    let s = d.as_secs();
    format!("{:02}:{:02}:{:02}", s / 3600, (s % 3600) / 60, s % 60)
}

fn main() {
    let maraton = Duration::from_secs(3 * 3600 + 27 * 60 + 5);
    let film = Duration::from_secs(5400);
    println!("maraton: {}", format_hms(maraton));
    println!("film:    {} ({:.1} ore)", format_hms(film), film.as_secs_f64() / 3600.0);

    let km = 42.195;
    let ritm = maraton.as_secs_f64() / km;
    println!("ritm: {}:{:02} min/km", (ritm / 60.0) as u64, (ritm % 60.0) as u64);
}

Rezultat

maraton: 03:27:05
film:    01:30:00 (1.5 ore)
ritm: 4:54 min/km

Greșeli frecvente

  • Folosești as_secs() pentru durate scurte și primești 0: tăie partea fracționară. Folosește as_millis() sau as_secs_f64().
  • Pui rezultatul lui as_millis() într-un u64 fără conversie: tipul este u128. Scrie as u64 sau u64::try_from(...).

Comenzi înrudite

  • Duration: O durată de timp (secunde și nanosecunde), creată cu from_secs, from_millis; se poate aduna, înmulți și compara.
  • 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.
  • SystemTime: Ora sistemului (ceasul din calendar); diferența față de UNIX_EPOCH dă timestamp-ul Unix în secunde.