Verschwenden Sie nicht Ihre Zeit mit Boost (ich weiß, dass viele von dieser Aussage beleidigt sein werden und sie für Ketzerei halten werden).
Diese Diskussion enthält zwei sehr praktikable Lösungen, bei denen Sie sich nicht an nicht standardmäßige Bibliotheken von Drittanbietern versklaven müssen.
C++ erhält Millisekundenzeit unter Linux -- clock() scheint nicht richtig zu funktionieren
http://linux.die.net/man/3/clock_gettime
Verweise auf gettimeofday finden Sie hier auf opengroup.org
Sie können Posix Time von Boost verwenden .
Sie können boost::posix_time::microsec_clock::local_time()
verwenden um die aktuelle Zeit von der Uhr mit Mikrosekundenauflösung zu erhalten:
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
Dann können Sie den Zeitversatz am aktuellen Tag berechnen (da Ihre Dauerausgabe die Form <hours>:<minutes>:<seconds>.<milliseconds>
hat , ich gehe davon aus, dass sie als Offset des aktuellen Tages berechnet werden; Wenn nicht, können Sie gerne einen anderen Startpunkt verwenden für Dauer/Zeitintervall):
boost::posix_time::time_duration td = now.time_of_day();
Dann können Sie .hours()
verwenden , .minutes()
, .seconds()
Zugriffsmethoden, um die entsprechenden Werte zu erhalten.
Leider scheint es keinen .milliseconds()
zu geben Accessor, aber es gibt einen .total_milliseconds()
eines; Sie können also ein wenig Subtraktionsrechnung durchführen, um die verbleibenden Millisekunden zu erhalten, die in der Zeichenfolge formatiert werden sollen.
Dann können Sie sprintf()
verwenden (oder sprintf()_s
wenn Sie an nicht-portablem VC++-Code interessiert sind), um diese Felder in einen rohen char
zu formatieren Puffer, und verpacken Sie diesen rohen C-String-Puffer sicher in einen robusten, praktischen std::string
Beispiel.
Siehe den kommentierten Code unten für weitere Details.
Die Ausgabe in der Konsole sieht so aus:
11:43:52.276
Beispielcode:
///////////////////////////////////////////////////////////////////////////////
#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
//
// e.g. 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';
}
///////////////////////////////////////////////////////////////////////////////
Hier ist eine Lösung, die ich ohne Boost gefunden habe
std::string getCurrentTimestamp()
{
using std::chrono::system_clock;
auto currentTime = std::chrono::system_clock::now();
char buffer[80];
auto transformed = currentTime.time_since_epoch().count() / 1000000;
auto millis = transformed % 1000;
std::time_t tt;
tt = system_clock::to_time_t ( currentTime );
auto timeinfo = localtime (&tt);
strftime (buffer,80,"%F %H:%M:%S",timeinfo);
sprintf(buffer, "%s:%03d",buffer,(int)millis);
return std::string(buffer);
}