CodeNebula
C++23stlexpert

std::chrono::parse, std::chrono::format (C++23 Addition)

C++23 · Completing Modern · Compiler flag: -std=c++23

Explanation

Parse and format time points and durations with string patterns.

Real-World Scenario

Parse user-input dates in a calendar application.

Quick Snippet

snippet.cpp
#include <chrono> auto tp = std::chrono::parse("%Y-%m-%d", "2025-09-09");

Full Example

chrono_parse_format.cpp
// CodeNebula - C++23 Example: std::chrono::parse and format
// Compile: g++ -std=c++23 -Wall -Wextra -o example chrono_parse_format.cpp
// Note: Requires GCC 13+ / Clang 17+

#include <chrono>
#include <format>
#include <iostream>
#include <sstream>
#include <string>

// C++23 adds std::chrono::parse for parsing time strings, complementing
// std::format for formatting. Together they provide a complete
// type-safe date/time formatting and parsing system.

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

    std::cout << "=== std::chrono::parse and format ===\n\n";

    // --- Formatting durations ---
    std::cout << "--- Formatting durations ---\n";
    auto dur = 3h + 25min + 10s;
    std::cout << "Duration: " << dur << "\n";

    auto ms_dur = 1500ms;
    std::cout << "Milliseconds: " << ms_dur << "\n\n";

    // --- Formatting time points ---
    std::cout << "--- Formatting time points ---\n";
    auto now = system_clock::now();
    auto today = floor<days>(now);

    // year_month_day from time point
    year_month_day ymd{today};
    std::cout << "Today: " << ymd << "\n";
    std::cout << "Year: " << (int)ymd.year()
              << ", Month: " << (unsigned)ymd.month()
              << ", Day: " << (unsigned)ymd.day() << "\n\n";

    // --- Parsing dates with chrono::parse ---
    std::cout << "--- Parsing with chrono::parse ---\n";

    // Parse a date string
    sys_seconds tp1;
    std::istringstream iss1("2024-06-15 14:30:00");
    iss1 >> parse("%Y-%m-%d %H:%M:%S", tp1);
    if (!iss1.fail()) {
        auto parsed_ymd = year_month_day{floor<days>(tp1)};
        auto tod = hh_mm_ss{tp1 - floor<days>(tp1)};
        std::cout << "Parsed: " << parsed_ymd
                  << " " << tod.hours().count()
                  << ":" << tod.minutes().count()
                  << ":" << tod.seconds().count() << "\n";
    }

    // Parse different format
    sys_seconds tp2;
    std::istringstream iss2("15/06/2024");
    iss2 >> parse("%d/%m/%Y", tp2);
    if (!iss2.fail()) {
        auto parsed = year_month_day{floor<days>(tp2)};
        std::cout << "Parsed DD/MM/YYYY: " << parsed << "\n";
    }

    // Parse time only
    seconds time_of_day;
    std::istringstream iss3("09:45:30");
    iss3 >> parse("%H:%M:%S", time_of_day);
    if (!iss3.fail()) {
        hh_mm_ss hms{time_of_day};
        std::cout << "Parsed time: " << hms.hours().count() << "h "
                  << hms.minutes().count() << "m "
                  << hms.seconds().count() << "s\n";
    }

    // --- Date arithmetic ---
    std::cout << "\n--- Date arithmetic ---\n";
    auto date = 2024y / March / 15d;
    auto next_month = date.year() / (date.month() + months{1}) / date.day();
    std::cout << "Date: " << date << "\n";
    std::cout << "Next month: " << next_month << "\n";

    auto weekday_today = weekday{today};
    std::cout << "Today is weekday index: " << weekday_today.c_encoding() << "\n";

    return 0;
}

// Expected output (dates vary based on current date):
// === std::chrono::parse and format ===
//
// --- Formatting durations ---
// Duration: 12310s
// Milliseconds: 1500ms
//
// --- Formatting time points ---
// Today: 2026-03-24
// Year: 2026, Month: 3, Day: 24
//
// --- Parsing with chrono::parse ---
// Parsed: 2024-06-15 14:30:0
// Parsed DD/MM/YYYY: 2024-06-15
// Parsed time: 9h 45m 30s
//
// --- Date arithmetic ---
// Date: 2024-03-15
// Next month: 2024-04-15
// Today is weekday index: 2
Run command
g++ -std=c++23 -Wall -Wextra -o example chrono_parse_format.cpp