std::chrono::duration_cast în C++

Transformă o durată în altă unitate, trunchiind partea care nu încape (de exemplu secunde în minute).

Sintaxă
template<class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const std::chrono::duration<Rep, Period>& d);

Ce face std::chrono::duration_cast

duration_cast<minutes>(d) transformă durata d în minute. Dacă unitatea țintă este mai mare, partea fracționară se taie (spre zero): 150 de secunde devin 2 minute.

Din C++17 există și std::chrono::floor (rotunjire în jos), ceil (în sus) și round (la cel mai apropiat). Pentru numere negative, duration_cast și floor dau rezultate diferite.

Cel mai des se folosește la afișarea unui timp măsurat: duration_cast<milliseconds>(sfarsit - inceput).count().

Parametri

Parametru Descriere
ToDuration Tipul țintă, de exemplu std::chrono::minutes.
d Durata de convertit.

Ce returnează

Durata în noua unitate.

Exemple

Exemplul 1: Trunchiere și variantele de rotunjire

#include <chrono>
#include <print>

int main() {
    using namespace std::chrono;
    seconds s(150);

    std::println("duration_cast: {}", duration_cast<minutes>(s));
    std::println("floor:         {}", floor<minutes>(s));
    std::println("ceil:          {}", ceil<minutes>(s));
    std::println("round:         {}", round<minutes>(s));

    seconds negativ(-150);
    std::println("-150 s: cast {}, floor {}", duration_cast<minutes>(negativ), floor<minutes>(negativ));
}

Rezultat

duration_cast: 2min
floor:         2min
ceil:          3min
round:         2min
-150 s: cast -2min, floor -3min

Exemplul 2: Ore, minute și secunde dintr-un număr de secunde

#include <chrono>
#include <print>

int main() {
    using namespace std::chrono;
    seconds total(7384);

    auto h = duration_cast<hours>(total);
    auto m = duration_cast<minutes>(total - h);
    auto s = total - h - m;
    std::println("{}h {}m {}s", h.count(), m.count(), s.count());

    std::println("{:%H:%M:%S}", total);   // formatare directă (C++20)
}

Rezultat

2h 3m 4s
02:03:04

Greșeli frecvente

  • Te aștepți ca duration_cast să rotunjească: 119 secunde devin 1 minut, nu 2. Pentru rotunjire folosește std::chrono::round.

Comenzi înrudite

  • std::chrono::duration: O durată de timp cu unitate de măsură: secunde, milisecunde, minute, ore. Conversiile sunt automate și sigure.
  • std::chrono::steady_clock: Ceas monoton, care nu sare niciodată înapoi: ceasul corect pentru măsurarea duratelor.
  • std::chrono::time_point: Un moment în timp măsurat după un anumit ceas. Diferența a două momente este o durată.