A short recipe outlining how to output a SYSTEMTIME value as a std::string.
The example format will be “YYYY-MM-DD HH:MM:SS.MMM”
I specifically wanted to include milliseconds.
In this example I employ three possible techniques:
1. MFC CString
2. std::ostringstream
3. sprintf
Example code listing shown:
#include <windows.h> #include <atlstr.h> #include <iostream> #include <sstream> #include <iomanip> int main() { SYSTEMTIME st, lt; GetSystemTime(&st); std::string strMessage; // Output a given SYSTEMTIME in the format " // 1. Using CString CString cstrMessage; cstrMessage.Format( "%d-%02d-%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ); strMessage = cstrMessage; std::cout << "System time = " << strMessage << std::endl; // 2. Formating using ostringstream std::ostringstream ossMessage; ossMessage << st.wYear << "-" << std::setw( 2 ) << std::setfill( '0' ) << st.wMonth << "-" << std::setw( 2 ) << std::setfill( '0' ) << st.wDay << " " << std::setw( 2 ) << std::setfill( '0' ) << st.wHour << ":" << std::setw( 2 ) << std::setfill( '0' ) << st.wMinute << ":" << std::setw( 2 ) << std::setfill( '0' ) << st.wSecond << "." << std::setw( 3 ) << std::setfill( '0' ) << st.wMilliseconds; strMessage = ossMessage.str(); std::cout << "System time = " << strMessage << std::endl; // 3. sprintf char buffer[ 256 ]; sprintf( buffer, "%d-%02d-%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ); strMessage = buffer; std::cout << "System time = " << strMessage << std::endl; return 0; }
All three techniques giving exactly the same output as shown:
Here is another example whereby I take a SYSTEMTIME
as input and output it to a stream in a given date/time format such as “Mon Oct 13 22:21:12 2014”. I create a class called TimeFormat
which is constructed from the format string and SYSTEMTIME, and outputs the desired output time format via an overloaded insertion (<<
) operator that can recognize an ostream
object on the left and a TimeFormat
object on the right. The overloaded << operator function is declared as a friend of class TimeFormat
so it can access the private data within the TimeFormat
object:
friend std::ostream& operator <<( std::ostream&, TimeFormat const & );
Full code listing as follows:
#include <iostream> #include <iterator> #include <string> #include <ctime> #include <locale> #include <Windows.h> const std::string TIME_PATTERN = "%a %b %d %H:%M:%S %Y"; class TimeFormat { public: TimeFormat(const std::string& strFormat, const SYSTEMTIME& stSystemDate) : m_strFormat( strFormat ), m_stSystemDate( stSystemDate ) {} friend std::ostream& operator <<( std::ostream&, TimeFormat const & ); private: std::string m_strFormat; SYSTEMTIME m_stSystemDate; }; std::ostream& operator <<( std::ostream& os, TimeFormat const& format ) { std::ostream::sentry s(os); if ( s ) { std::tm tmSystemDate; tmSystemDate.tm_sec = format.m_stSystemDate.wSecond; tmSystemDate.tm_min = format.m_stSystemDate.wMinute; tmSystemDate.tm_hour = format.m_stSystemDate.wHour; tmSystemDate.tm_mday = format.m_stSystemDate.wDay; tmSystemDate.tm_mon = format.m_stSystemDate.wMonth - 1; tmSystemDate.tm_year = format.m_stSystemDate.wYear - 1900; tmSystemDate.tm_isdst = -1; std::time_t t = std::mktime( &tmSystemDate ); std::tm const* tm = std::localtime(&t); std::ostreambuf_iterator<char> output( os ); std::use_facet<std::time_put<char>>(os.getloc()).put( output, os, os.fill(), tm, &format.m_strFormat[0], &format.m_strFormat[0] + format.m_strFormat.size() ); } os.width( 0 ); return os; } int main() { SYSTEMTIME stSystemDate; GetSystemTime( &stSystemDate ); std::cout << TimeFormat( TIME_PATTERN, stSystemDate ); }
Which will give the following output: