如何使用C ++ / C ++ 11打印当前时间(以毫秒为单位)

目前我使用这个代码

string now() { time_t t = time(0); char buffer[9] = {0}; strftime(buffer, 9, "%H:%M:%S", localtime(&t)); return string(buffer); } 

格式化时间。 我需要添加毫秒,所以输出的格式是: 16:56:12.321

Solutions Collecting From Web of "如何使用C ++ / C ++ 11打印当前时间(以毫秒为单位)"

你可以使用Boost的Posix Time

您可以使用boost::posix_time::microsec_clock::local_time()从微秒分辨率时钟获取当前时间:

 boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); 

那么你可以计算当天的时间偏移量(因为你的持续时间输出的形式是<hours>:<minutes>:<seconds>.<milliseconds> ,我假设它们被计算为当前日偏移量;如果它们不是,随意使用另一个起点持续时间/时间间隔):

 boost::posix_time::time_duration td = now.time_of_day(); 

然后,您可以使用.minutes() .seconds() .minutes() .seconds()访问器来获取相应的值。
不幸的是,似乎没有.milliseconds()访问器,但有一个.total_milliseconds()之一; 所以你可以做一些减法数学来获得剩余的毫秒数来格式化字符串。

然后你可以使用sprintf() (或者sprintf()_s如果你对不可移植的仅限于VC ++的代码感兴趣)将这些字段格式化为原始char缓冲区,然后将这个原始C字符串缓冲区安全地包装成一个健壮的方便的std::string实例。

请参阅下面的注释代码以获取更多详细信息。

在控制台中的输出是这样的:

11:43:52.276


示例代码:

 /////////////////////////////////////////////////////////////////////////////// #include <stdio.h> // for sprintf() #include <iostream> // for console output #include <string> // for std::string #include <boost/date_time/posix_time/posix_time.hpp> //----------------------------------------------------------------------------- // Format current time (calculated as an offset in current day) in this form: // // "hh:mm:ss.SSS" (where "SSS" are milliseconds) //----------------------------------------------------------------------------- std::string now_str() { // Get current time from the clock, using microseconds resolution const boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); // Get the time offset in current day const boost::posix_time::time_duration td = now.time_of_day(); // // Extract hours, minutes, seconds and milliseconds. // // Since there is no direct accessor ".milliseconds()", // milliseconds are computed _by difference_ between total milliseconds // (for which there is an accessor), and the hours/minutes/seconds // values previously fetched. // const long hours = td.hours(); const long minutes = td.minutes(); const long seconds = td.seconds(); const long milliseconds = td.total_milliseconds() - ((hours * 3600 + minutes * 60 + seconds) * 1000); // // Format like this: // // hh:mm:ss.SSS // // eg 02:15:40:321 // // ^ ^ // | | // 123456789*12 // ---------10- --> 12 chars + \0 --> 13 chars should suffice // // char buf[40]; sprintf(buf, "%02ld:%02ld:%02ld.%03ld", hours, minutes, seconds, milliseconds); return buf; } int main() { std::cout << now_str() << '\n'; } /////////////////////////////////////////////////////////////////////////////// 

不要浪费你的时间与提振(我知道很多人会被这个声明冒犯,并认为它的异端)。

这个讨论包含两个非常可行的解决方案,不需要你自己奴役非标准的第三方库。

C ++在Linux上获取毫秒时间 – clock()似乎不能正常工作

http://linux.die.net/man/3/clock_gettime

参考gettimeofday可以在这里找到opengroup.org

你可以使用boost::posix_time 。 看到这个问题 。 例如:

 boost::posix_time::time_duration diff = tick - now; diff.total_milliseconds(); 

获取当前时间:

 boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time(); // ('tick' and 'now' are of the type of 't1') 

如果你可以使用C ++ 11,你也可以使用C ++ 11 chrono 。 例如:

 int elapsed_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count(); 

要获取当前时间(您有几个不同的时钟可用,请参阅文档):

 std::chrono::time_point<std::chrono::system_clock> t2; t2 = std::chrono::system_clock::now(); // ('start' and 'end' are of the type of 't2') 

以毫秒为单位的时间,您可以获得午夜和当前时间之间的持续时间。 示例与std :: chrono :

 unsigned int millis_since_midnight() { // current time std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); // get midnight time_t tnow = std::chrono::system_clock::to_time_t(now); tm *date = std::localtime(&tnow); date->tm_hour = 0; date->tm_min = 0; date->tm_sec = 0; auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date)); // number of milliseconds between midnight and now, ie current time in millis // The same technique can be used for time since epoch return std::chrono::duration_cast<std::chrono::milliseconds>(now - midnight).count(); } 

我建议使用Boost.Chrono而不是Boost.Datetime库,因为Chrono成为C ++ 11的一部分。 这里的例子