Search code examples
c++windowsvisual-studio-2010timeutc

C++: Getting the Current Time as a W3C UTC Time String


How can I get the current time as a W3C UTC time string as documented at W3C Date and Time Formats (Profile of ISO 8601)?

Specifically, here is the format I am after:

yyyy-mm-ddThh:mm:ssZ

Example:

2013-05-24T20:07:47Z

Note: I am using Visual Studio 2010.


Solution

  • Here is my solution. Visual Studio 2010 references: time(), gmtime_s()

    #include <iomanip>
    #include <sstream>
    #include <time.h>
    
    /**
     * Get the current time as a W3C UTC time string.
     *
     * @return A time string; the empty string if something goes wrong.
     */
    std::string GetUTCTimeString(void)
    {
        time_t seconds_since_the_epoch;
        struct tm tm_struct;
        errno_t err;
        std::ostringstream buf;
    
        // Return the time as seconds elapsed since midnight, January 1, 1970,
        // or -1 in the case of an error.
        time(&seconds_since_the_epoch);
    
        if (seconds_since_the_epoch == -1) {
            return "";
        }
    
        // Convert the time in seconds to the time structure.
        err = gmtime_s(&tm_struct, &seconds_since_the_epoch);
    
        if (err) {
            return "";
        }
    
        // Format the structure as a W3C UTC date/time string with the special
        // UTC designator 'Z'.
        buf
            <<        std::setw(4) << std::setfill('0') << tm_struct.tm_year + 1900
            << "-" << std::setw(2) << std::setfill('0') << tm_struct.tm_mon + 1
            << "-" << std::setw(2) << std::setfill('0') << tm_struct.tm_mday
            << "T" << std::setw(2) << std::setfill('0') << tm_struct.tm_hour
            << ":" << std::setw(2) << std::setfill('0') << tm_struct.tm_min
            << ":" << std::setw(2) << std::setfill('0') << tm_struct.tm_sec
            << "Z";
    
        return buf.str();
    }