std::chrono::system_clock în C++

Ceasul sistemului: data și ora reale (UTC), care pot fi transformate în dată calendaristică.

Sintaxă
#include <chrono>
auto acum = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(acum);

Ce face std::chrono::system_clock

system_clock::now() returnează momentul curent după ceasul calculatorului, ca time_point. Din C++20 este definit ca timp UTC numărat de la 1 ianuarie 1970 și poate fi afișat direct cu std::println (format implicit AAAA-LL-ZZ HH:MM:SS, în UTC).

Este ceasul potrivit pentru date și ore („când s-a creat comanda”). Nu este potrivit pentru măsurarea duratelor, pentru că poate sări înainte sau înapoi (sincronizare NTP, schimbare manuală a orei); pentru măsurători folosește std::chrono::steady_clock.

to_time_t și from_time_t fac legătura cu funcțiile vechi din C (std::time_t). std::chrono::sys_days este un moment al acestui ceas cu precizie de o zi.

Ce returnează

now() returnează un std::chrono::system_clock::time_point.

Exemple

Exemplul 1: Ora curentă

Rezultatul depinde de momentul rulării, iar ora este în UTC (în România, ora locală este UTC+2 iarna și UTC+3 vara).

#include <chrono>
#include <print>

int main() {
    auto acum = std::chrono::system_clock::now();
    std::println("Acum (UTC): {}", acum);
    std::println("Data: {:%d.%m.%Y}", acum);

    auto secunde = std::chrono::floor<std::chrono::seconds>(acum);
    std::println("Fără fracțiuni: {}", secunde);
}

Rezultat posibil (diferă la fiecare rulare)

Acum (UTC): 2026-10-19 09:42:17.518394
Data: 19.10.2026
Fără fracțiuni: 2026-10-19 09:42:17

Exemplul 2: Un moment fix și legătura cu time_t

Pornind de la o dată fixă, rezultatul este mereu același.

#include <chrono>
#include <ctime>
#include <print>

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

    system_clock::time_point lansare = sys_days{2024y / March / 15} + 18h + 30min;
    std::println("Lansare: {:%d.%m.%Y, ora %H:%M} UTC", lansare);

    std::time_t t = system_clock::to_time_t(lansare);
    std::println("Secunde de la 1970: {}", t);

    auto inapoi = system_clock::from_time_t(t);
    std::println("Același moment: {}", inapoi == lansare);
}

Rezultat

Lansare: 15.03.2024, ora 18:30 UTC
Secunde de la 1970: 1710527400
Același moment: true

Greșeli frecvente

  • Măsori cât durează o operație cu system_clock. Dacă ceasul sistemului este ajustat între timp, rezultatul poate fi greșit sau chiar negativ; folosește steady_clock.
  • Afișezi system_clock::now() și te miri că ora este cu 2-3 ore în urmă. Este ora UTC; pentru ora locală e nevoie de std::chrono::zoned_time și de baza de date a fusurilor orare.

Comenzi înrudite

  • 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ă.
  • std::chrono::year_month_day: O dată calendaristică (an, lună, zi) cu validare, ziua săptămânii și calcule cu luni și ani.
  • std::put_time: Afișează o dată și o oră (std::tm) după un șablon, de exemplu %d.%m.%Y %H:%M.