Converting between different date formats with std::chrono

In modern C++, the <chrono> library provides a powerful and flexible way to work with dates and time points. It allows you to easily convert between different date formats using its various duration and time point classes.

Formatting a date as a string

To convert a std::chrono::system_clock time point to a string representation, you can use the std::put_time function along with a std::tm object. The std::tm object holds the individual components of the date and time.

Here’s an example of converting a std::chrono::system_clock time point to a string formatted as “YYYY-MM-DD”:

#include <iostream>
#include <chrono>
#include <iomanip>

int main() {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t time = std::chrono::system_clock::to_time_t(now);
    std::tm* tm = std::localtime(&time);

    std::cout << std::put_time(tm, "%Y-%m-%d") << std::endl;

    return 0;
}

In this example, we first obtain the current system time as a std::chrono::system_clock::time_point using std::chrono::system_clock::now(). Then, we convert it to a std::time_t value using std::chrono::system_clock::to_time_t. Finally, we convert the std::time_t value to a std::tm object using std::localtime.

The std::put_time function, which is part of the <iomanip> header, allows us to format the std::tm object as a string. In this case, we use the format string “%Y-%m-%d” to represent the date as “YYYY-MM-DD”.

Parsing a string as a date

To convert a string representation of a date to a std::chrono::system_clock::time_point, you can use std::get_time function along with a std::tm object. The std::get_time function parses the string according to a specified format and fills the std::tm object with the parsed values.

Here’s an example of parsing a string formatted as “YYYY-MM-DD” into a std::chrono::system_clock::time_point:

#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>

int main() {
    std::string dateString = "2022-01-01";
    std::tm tm = {};
    std::stringstream ss(dateString);
    ss >> std::get_time(&tm, "%Y-%m-%d");

    auto timePoint = std::chrono::system_clock::from_time_t(std::mktime(&tm));

    std::cout << timePoint.time_since_epoch().count() << std::endl;

    return 0;
}

In this example, we first define a string dateString containing the date in the format “YYYY-MM-DD”. Then, we initialize a std::tm object with zeros. Next, we create a std::stringstream and initialize it with the dateString. We then use std::get_time to parse the string and store the result in the std::tm object.

Finally, we convert the std::tm object to a std::chrono::system_clock::time_point using std::chrono::system_clock::from_time_t and std::mktime. The from_time_t function converts a std::time_t value to a std::chrono::system_clock::time_point, while std::mktime converts a std::tm object to a std::time_t value.

Conclusion

With the <chrono> library in C++, converting between different date formats is made easy. Whether you need to format a date as a string or parse a string as a date, the std::chrono facilities provide a convenient way to perform these operations. By leveraging the powerful features of <chrono>, you can handle date manipulations efficiently in your C++ programs.

#cplusplus #datetime