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ștesteady_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 destd::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.