Ne perdez pas votre temps avec Boost (je sais que beaucoup seront offensés par cette déclaration et la considéreront comme une hérésie).
Cette discussion contient deux solutions très pratiques qui ne vous obligent pas à vous asservir à des bibliothèques tierces non standard.
C++ obtient le temps en millisecondes sous Linux -- clock() ne semble pas fonctionner correctement
http://linux.die.net/man/3/clock_gettime
Les références à gettimeofday peuvent être trouvées ici sur opengroup.org
Vous pouvez utiliser le Posix Time de Boost .
Vous pouvez utiliser boost::posix_time::microsec_clock::local_time()
pour obtenir l'heure actuelle à partir d'une horloge à résolution de microsecondes :
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
Ensuite, vous pouvez calculer le décalage horaire dans le jour en cours (puisque votre sortie de durée est sous la forme <hours>:<minutes>:<seconds>.<milliseconds>
, je suppose qu'ils sont calculés en tant que décalage du jour actuel ; si ce n'est pas le cas, n'hésitez pas à utiliser un autre point de départ pour la durée/intervalle de temps):
boost::posix_time::time_duration td = now.time_of_day();
Ensuite, vous pouvez utiliser .hours()
, .minutes()
, .seconds()
accesseurs pour obtenir les valeurs correspondantes.
Malheureusement, il ne semble pas y avoir de .milliseconds()
accesseur, mais il y a un .total_milliseconds()
une; vous pouvez donc faire un peu de calcul de soustraction pour obtenir les millisecondes restantes à formater dans la chaîne.
Ensuite, vous pouvez utiliser sprintf()
(ou sprintf()_s
si vous êtes intéressé par du code VC++ uniquement non portable) pour formater ces champs en un char
brut tampon, et encapsulez en toute sécurité ce tampon de chaîne C brute dans un std::string
robuste et pratique exemple.
Voir le code commenté ci-dessous pour plus de détails.
La sortie dans la console ressemble à :
11:43:52.276
Exemple de code :
///////////////////////////////////////////////////////////////////////////////
#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';
}
///////////////////////////////////////////////////////////////////////////////
Voici une solution que j'ai trouvée sans utiliser boost
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);
}