GNU/Linux >> Belajar Linux >  >> Linux

Cara mencetak waktu saat ini (dengan milidetik) menggunakan C++ / C++11

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);
}

Linux
  1. Bagaimana cara menyinkronkan waktu menggunakan NTP di server Ubuntu?

  2. Bagaimana cara mengisi file dengan FF menggunakan dd?

  3. Di Linux cara membuat file dengan nama tanggal dan waktu saat ini

  1. Bagaimana Cara Mencetak Variabel Dengan Perataan Pusat Empuk?

  2. Cara Menjadwalkan Tugas Menggunakan di di Linux

  3. Cara mendapatkan total penggunaan cpu di Linux menggunakan C++

  1. Bagaimana cara mendapatkan jejak tumpukan untuk C++ menggunakan gcc dengan informasi nomor baris?

  2. Cara mencetak anggota objek c++ menggunakan GDB dari alamat jika tipe kelas objek seperti A::B

  3. Bagaimana Anda membuat jendela di Linux dengan C++?