std::chrono::time_point în C++

Un moment în timp măsurat după un anumit ceas. Diferența a două momente este o durată.

Sintaxă
template<class Clock, class Duration = typename Clock::duration>
class time_point;
Duration time_since_epoch() const;

Ce face std::chrono::time_point

time_point<Ceas, Durata> este un moment: o durată numărată de la „epoca” ceasului (pentru system_clock, 1 ianuarie 1970 UTC). time_since_epoch() returnează această durată.

Operațiile au sens fizic: moment + durată = moment, moment − moment = durată, iar două momente se pot compara. Nu poți aduna două momente între ele.

C++20 adaugă alias-uri utile: sys_days (moment cu precizie de o zi), sys_seconds (precizie de o secundă). time_point_cast, floor, round schimbă precizia.

Ce returnează

Un moment în timp; time_since_epoch() returnează o durată.

Exemple

Exemplul 1: Operații cu momente

#include <chrono>
#include <print>

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

    sys_seconds plecare = sys_days{2025y / July / 1} + 22h + 15min;
    sys_seconds sosire = plecare + 9h + 40min;

    std::println("Plecare: {}", plecare);
    std::println("Sosire:  {}", sosire);
    std::println("Durata:  {}", duration_cast<minutes>(sosire - plecare));
    std::println("Sosește a doua zi: {}", floor<days>(sosire) > floor<days>(plecare));
}

Rezultat

Plecare: 2025-07-01 22:15:00
Sosire:  2025-07-02 07:55:00
Durata:  580min
Sosește a doua zi: true

Exemplul 2: time_since_epoch

#include <chrono>
#include <print>

int main() {
    using namespace std::chrono;
    sys_days ziua = 2000y / January / 1;
    std::println("zile de la 1970: {}", ziua.time_since_epoch());
    std::println("secunde: {}", duration_cast<seconds>(ziua.time_since_epoch()).count());
}

Rezultat

zile de la 1970: 10957d
secunde: 946684800

Greșeli frecvente

  • Scazi momente de la ceasuri diferite (system_clock și steady_clock). Nu compilează, pentru că au epoci diferite și diferența nu are sens.

Comenzi înrudite

  • std::chrono::system_clock: Ceasul sistemului: data și ora reale (UTC), care pot fi transformate în dată calendaristică.
  • std::chrono::duration: O durată de timp cu unitate de măsură: secunde, milisecunde, minute, ore. Conversiile sunt automate și sigure.
  • std::chrono::year_month_day: O dată calendaristică (an, lună, zi) cu validare, ziua săptămânii și calcule cu luni și ani.