DEV Community

Codes With Pankaj
Codes With Pankaj

Posted on

3

Comprehensive Guide to C++ Date and Time - @codeswithpankaj

Welcome to this detailed tutorial on handling date and time in C++, a crucial aspect of many applications. Manipulating and working with dates and times can be complex, but with C++'s <chrono> library and other facilities, you can perform a wide range of operations efficiently. In this tutorial, we'll explore various aspects of dealing with date and time in C++, providing comprehensive examples for each topic.

Table of Contents

  1. Introduction to C++ Date and Time
  2. Current Date and Time
  3. Working with std::chrono
  4. Formatting and Parsing
  5. Duration and Time Points
  6. Manipulating Dates and Times
  7. Time Zones
  8. Practical Example
  9. Conclusion

1. Introduction to C++ Date and Time

C++ provides facilities for handling date and time through the <chrono> library and other functionalities. Managing temporal data is crucial for applications ranging from scheduling to logging.

2. Current Date and Time

Obtaining the current date and time is a fundamental operation. C++ provides std::chrono::system_clock for this purpose.

#include <iostream>
#include <chrono>

int main() {
    auto now = std::chrono::system_clock::now();
    std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
    std::cout << "Current time: " << std::ctime(&currentTime) << std::endl;

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

3. Working with std::chrono

The <chrono> library introduces a flexible and type-safe way to represent durations and time points.

#include <iostream>
#include <chrono>

int main() {
    // Representing a duration
    std::chrono::duration<int, std::ratio<1, 5>> fiveSeconds(5);

    // Representing a time point
    std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

4. Formatting and Parsing

Formatting and parsing involve converting between strings and std::chrono::time_point objects.

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

int main() {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t currentTime = std::chrono::system_clock::to_time_t(now);

    // Formatting
    std::cout << "Formatted time: " << std::put_time(std::localtime(&currentTime), "%Y-%m-%d %H:%M:%S") << std::endl;

    // Parsing
    std::istringstream input("2023-01-15 14:30:00");
    std::tm parsedTime = {};
    input >> std::get_time(&parsedTime, "%Y-%m-%d %H:%M:%S");
    std::chrono::system_clock::time_point parsedPoint = std::chrono::system_clock::from_time_t(std::mktime(&parsedTime));

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

5. Duration and Time Points

Durations represent the difference between two time points, while time points represent points in time.

#include <iostream>
#include <chrono>

int main() {
    // Duration
    std::chrono::duration<int> seconds(5);
    std::chrono::duration<double, std::milli> milliseconds(2500);

    // Time Points
    auto start = std::chrono::steady_clock::now();
    // ... (some operation)
    auto end = std::chrono::steady_clock::now();
    std::chrono::duration<double> elapsed = end - start;

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

6. Manipulating Dates and Times

The <chrono> library provides functionalities for adding and subtracting durations from time points.

#include <iostream>
#include <chrono>

int main() {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();

    // Adding 3 days
    std::chrono::duration<int, std::ratio<3600*24>> threeDays(3);
    auto future = now + threeDays;

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

7. Time Zones

Handling time zones is crucial for applications dealing with internationalization. While C++ does not provide built-in support for time zones, third-party libraries like Boost.DateTime can be used.

// Example using Boost.DateTime for time zone support
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() {
    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
    std::cout << "Current local time: " << now << std::endl;

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

8. Practical

Example

Let's apply our knowledge to a practical example: a program that calculates the difference between two dates.

#include <iostream>
#include <chrono>

int main() {
    std::tm startDate = {0, 0, 0, 15, 0, 2022 - 1900}; // January 15, 2022
    std::tm endDate = {0, 0, 0, 1, 0, 2023 - 1900};   // January 1, 2023

    std::chrono::system_clock::time_point start = std::chrono::system_clock::from_time_t(std::mktime(&startDate));
    std::chrono::system_clock::time_point end = std::chrono::system_clock::from_time_t(std::mktime(&endDate));

    std::chrono::duration<double> difference = end - start;

    std::cout << "Difference in days: " << difference.count() / (24 * 3600) << std::endl;

    // ... (rest of the code)
}
Enter fullscreen mode Exit fullscreen mode

9. Conclusion

Congratulations! You've now explored the essential aspects of handling date and time in C++. The <chrono> library provides a robust foundation for temporal operations, and third-party libraries can extend functionality for more advanced use cases.

For more programming tutorials and resources, visit codeswithpankaj.com. Happy coding!

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (1)

Collapse
 
pgradot profile image
Pierre Gradot • Edited

C++20 has introduced a lot of new features in <chrono>, including time zones en.cppreference.com/w/cpp/header/c...
I haven't tried these features yet so I can't tell how you can convert this Boost-based code to std-based code.

EDIT: I tried (with Compiler Explorer, as it requires clang 17 or gcc 13, which my Debian version doesn't provide. Here is what you can get:

#include <chrono>
#include <iostream>

int main()
{
    // UTC (system_clock is guaranteed to be UTC since C++20)
    const auto now = std::chrono::system_clock::now();
    std::cout << "UTC time = " << now << '\n';

    // Local
    const auto local_now = std::chrono::zoned_time{std::chrono::current_zone(), now};
    std::cout << "Local time = " << local_now << "\n";

    // Somewhere
    const auto somewhere_tz = std::chrono::locate_zone("Asia/Ho_Chi_Minh");
    const auto somewhere_now = std::chrono::zoned_time{somewhere_tz, now};
    std::cout << somewhere_tz->name() << " time = " << somewhere_now << '\n';

    // Possible time zone names
    const auto &tzdb = std::chrono::get_tzdb();
    std::cout << "Database version = " << tzdb.version << '\n';
    for (auto &tz : tzdb.zones)
    {
        std::cout << "  - " << tz.name() << "\n";
    }
}
Enter fullscreen mode Exit fullscreen mode

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay