Jangan buang waktu Anda dengan Boost (saya tahu banyak yang akan tersinggung dengan pernyataan ini dan menganggapnya bid'ah).
Diskusi ini berisi dua solusi yang sangat bisa diterapkan yang tidak mengharuskan Anda memperbudak diri sendiri ke perpustakaan pihak ketiga yang tidak standar.
C++ mendapatkan waktu milidetik di Linux -- clock() sepertinya tidak berfungsi dengan baik
http://linux.die.net/man/3/clock_gettime
Referensi untuk gettimeofday dapat ditemukan di sini di opengroup.org
Anda dapat menggunakan Boost's Posix Time .
Anda dapat menggunakan boost::posix_time::microsec_clock::local_time()
untuk mendapatkan waktu saat ini dari jam beresolusi mikrodetik:
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
Kemudian Anda dapat menghitung offset waktu pada hari ini (karena keluaran durasi Anda dalam bentuk <hours>:<minutes>:<seconds>.<milliseconds>
, saya berasumsi mereka dihitung sebagai offset hari ini; jika tidak, silakan gunakan titik awal lainnya untuk durasi/interval waktu):
boost::posix_time::time_duration td = now.time_of_day();
Kemudian Anda dapat menggunakan .hours()
, .minutes()
, .seconds()
pengakses untuk mendapatkan nilai yang sesuai.
Sayangnya, sepertinya tidak ada .milliseconds()
pengakses, tetapi ada .total_milliseconds()
satu; sehingga Anda dapat melakukan sedikit matematika pengurangan untuk mendapatkan milidetik yang tersisa untuk diformat dalam string.
Kemudian Anda dapat menggunakan sprintf()
(atau sprintf()_s
jika Anda tertarik dengan kode khusus VC++ non-portabel) untuk memformat bidang tersebut menjadi char
mentah buffer, dan dengan aman membungkus buffer string C mentah ini menjadi std::string
yang nyaman dan kuat misalnya.
Lihat kode yang dikomentari di bawah untuk detail lebih lanjut.
Keluaran di konsol kira-kira seperti:
11:43:52.276
Kode contoh:
///////////////////////////////////////////////////////////////////////////////
#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';
}
///////////////////////////////////////////////////////////////////////////////
Ini solusi yang saya temukan tanpa menggunakan 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);
}