c++datec++11timec++-chrono

Outputting Date and Time in C++ using std::chrono


I have been upgrading some old code and have been trying to update to C++11 where possible. The following code is how I used to display the time and date in my program

#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

std::string return_current_time_and_date()
{
    time_t now = time(0);
    struct tm tstruct;
    char buf[80];
    tstruct = *localtime(&now);
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    return buf;
}

I would like to output the current time and date in a similar format using std::chrono (or similar).


Solution

  • The <chrono> library only deals with time and not dates, except for the system_clock which has the ability to convert its timepoints to time_t. So using <chrono> for dates will not improve things much. Hopefully we get something like chrono::date in the not too distant future.

    That said, you can use <chrono> in the following way:

    #include <chrono>  // chrono::system_clock
    #include <ctime>   // localtime
    #include <sstream> // stringstream
    #include <iomanip> // put_time
    #include <string>  // string
    
    std::string return_current_time_and_date()
    {
        auto now = std::chrono::system_clock::now();
        auto in_time_t = std::chrono::system_clock::to_time_t(now);
    
        std::stringstream ss;
        ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X");
        return ss.str();
    }
    

    Note that std::localtime may cause data races. localtime_r or similar functions may be available on your platforms.

    Update:

    Using a new version of Howard Hinnant's date library you can write:

    #include "date.h"
    #include <chrono>
    #include <string>
    #include <sstream>
    
    std::string return_current_time_and_date() {
      auto now = std::chrono::system_clock::now();
      auto today = date::floor<days>(now);
    
      std::stringstream ss;
      ss << today << ' ' << date::make_time(now - today) << " UTC";
      return ss.str();
    }
    

    This will print out something like "2015-07-24 05:15:34.043473124 UTC".