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șteduration_cast(trunchiază) saufloor/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
std::chrono::duration_cast: Transformă o durată în altă unitate, trunchiind partea care nu încape (de exemplu secunde în minute).std::chrono::time_point: Un moment în timp măsurat după un anumit ceas. Diferența a două momente este o durată.std::this_thread::sleep_for: Oprește firul de execuție curent pentru (cel puțin) durata dată.std::chrono::steady_clock: Ceas monoton, care nu sare niciodată înapoi: ceasul corect pentru măsurarea duratelor.