Wie man UTC-Datum/Zeitstempel in C++ in einen std::chrono::time_point parst

Die folgende Funktion parst eine Zeichenkette wie

input.txt
2023-07-04 09:57:01

in einen UTC-Zeitstempel.

parse_utc.cpp
#include <chrono>
#include <sstream>
#include <ctime>

std::chrono::time_point<std::chrono::system_clock> ParseDatetimeFromTimeString(const std::string& timeString) {
    std::tm t = {};
    std::istringstream ss(timeString);
    ss >> std::get_time(&t, "%Y-%m-%d %H:%M:%S");
    if (ss.fail()) {
        throw std::runtime_error("Failed to parse filename time string");
    }
    // Convert timestamp to epoch time assuming UTC
    std::time_t timet = timegm(&t);
    // Convert timet to std::chrono::time_point<std::chrono::system_clock>
    return std::chrono::system_clock::from_time_t(timet);
}

Testcode

test.cpp
auto timepoint = ParseDatetimeFromTimeString("2023-07-04 09:57:01");
// print timepoint
std::time_t timet = std::chrono::system_clock::to_time_t(timepoint);
std::cout << std::put_time(std::gmtime(&timet), "%F %T") << std::endl; // Prints 2023-07-04 09:57:01

Da ParseDatetimeFromTimeString() den Zeitstempel als UTC parst, können wir std::put_time(std::gmtime(...)) verwenden, um den ursprünglichen Zeitstempel zurückzudrucken:

output.txt
2023-07-04 09:57:01

Check out similar posts by category: C/C++