Skip to content
  • Time with <chrono> · C++

Time with <chrono>

LearnViaNotes @learnvianotes· 2 min read

<chrono> models time with types: durations (5s, 250ms), time points (a clock reading) and clocks. Units are checked at compile time — no more “was that seconds or milliseconds?”.

Durations

C++
#include <chrono>
#include <iostream>

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

    auto timeout = 2s + 500ms;                         // std::chrono::milliseconds (2500)
    std::cout << timeout.count() << "ms\n";

    seconds s = duration_cast<seconds>(timeout);        // lossy conversion must be explicit
    std::cout << s.count() << "s\n";

    minutes m = 90min;
    hours h = duration_cast<hours>(m);
    std::cout << h.count() << "h " << (m - h).count() << "min\n";

    duration<double> secs = timeout;                    // floating-point seconds: implicit is fine
    std::cout << secs.count() << '\n';
    std::cout << (1h > 59min) << '\n';
}
Output
2500ms
2s
1h 30min
2.5
1

Measuring elapsed time

C++
#include <chrono>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    auto start = std::chrono::steady_clock::now();       // monotonic: right clock for measuring
    std::vector<long long> v(1'000'000);
    std::iota(v.begin(), v.end(), 1);
    long long sum = std::accumulate(v.begin(), v.end(), 0LL);
    auto end = std::chrono::steady_clock::now();

    auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    std::cout << "sum = " << sum << '\n';
    std::cout << "took " << us.count() << " us\n";      // varies run to run
}
ClockUse
steady_clockMeasuring intervals (never goes backwards)
system_clockWall-clock time; convertible to calendar dates / time_t
high_resolution_clockAlias of one of the above — prefer steady_clock explicitly

Calendar dates (C++20)

C++
#include <chrono>
#include <format>
#include <iostream>

int main() {
    using namespace std::chrono;
    year_month_day launch = 2024y / March / 15;
    sys_days d = launch;
    sys_days later = d + days(30);
    std::cout << std::format("{} -> {}\n", launch, year_month_day{later});
    std::cout << weekday{d} << ' ' << (2024y).is_leap() << '\n';
    std::cout << std::format("{}\n", 1500ms);
}
Output
2024-03-15 -> 2024-04-14
Fri 1
1500ms

Why use std::chrono instead of plain integers for time?

Free for students and teachers

Write notes like this one

Cards for every idea, quizzes and flashcards, read aloud — on the web and your phone.

Something wrong with this note? Open it to report