std::chrono::duration în C++

O durată de timp cu unitate de măsură: secunde, milisecunde, minute, ore. Conversiile sunt automate și sigure.

Sintaxă
#include <chrono>
template<class Rep, class Period = std::ratio<1>>
class duration;
using namespace std::chrono_literals;   // 90min, 2h, 500ms ...

Ce face std::chrono::duration

std::chrono::duration reprezintă o durată: un număr plus o unitate. Tipurile gata definite sunt nanoseconds, microseconds, milliseconds, seconds, minutes, hours și, din C++20, days, weeks, months, years. count() returnează numărul.

Cu using namespace std::chrono_literals; poți scrie direct 90min, 2h, 500ms, 10s. Duratele se pot aduna, scădea și compara chiar dacă au unități diferite; rezultatul are unitatea cea mai fină.

Conversia spre o unitate mai fină (secunde în milisecunde) este automată, pentru că nu pierde nimic. Spre o unitate mai mare (secunde în minute) trebuie std::chrono::duration_cast. Din C++20, std::format (deci și std::println) afișează duratele cu unitatea (90min, 1500ms).

Ce returnează

Un obiect durată. count() returnează numărul de unități.

Exemple

Exemplul 1: Literali și afișare

#include <chrono>
#include <print>

int main() {
    using namespace std::chrono_literals;

    auto film = 2h + 15min;
    std::chrono::seconds pauza = 90s;
    std::chrono::milliseconds timeout = 1500ms;

    std::println("film: {} ({} minute)", film, film.count());
    std::println("pauză: {}", pauza);
    std::println("timeout: {} = {} secunde", timeout, timeout.count() / 1000.0);
}

Rezultat

film: 135min (135 minute)
pauză: 90s
timeout: 1500ms = 1.5 secunde

Exemplul 2: Conversii automate și comparații

Secundele se transformă automat în milisecunde (fără pierdere). Comparația dintre unități diferite este corectă.

#include <chrono>
#include <print>

int main() {
    using namespace std::chrono;

    milliseconds ms = seconds(3);       // conversie automată
    std::println("3 s = {}", ms);

    std::println("1 min == 60 s: {}", minutes(1) == seconds(60));
    std::println("1500 ms > 1 s: {}", milliseconds(1500) > seconds(1));

    duration<double> secunde = milliseconds(2750);   // durată cu zecimale
    std::println("{}", secunde);
}

Rezultat

3 s = 3000ms
1 min == 60 s: true
1500 ms > 1 s: true
2.75s

Exemplul 3: Timpul total al unor melodii

#include <chrono>
#include <print>
#include <vector>

int main() {
    using namespace std::chrono;
    std::vector<seconds> melodii{seconds(215), seconds(187), seconds(242)};

    seconds total{0};
    for (auto m : melodii) total += m;

    auto min = duration_cast<minutes>(total);
    auto sec = total - min;
    std::println("Album: {} min {} s ({})", min.count(), sec.count(), total);
}

Rezultat

Album: 10 min 44 s (644s)

Greșeli frecvente

  • Scrii std::chrono::minutes m = std::chrono::seconds(90);. Nu compilează, pentru că s-ar pierde 30 de secunde. Folosește duration_cast (trunchiază) sau floor/round.
  • Folosești count() fără să știi unitatea. count() pe o durată în milisecunde dă milisecunde; transformă întâi în unitatea dorită.

Comenzi înrudite