GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So drucken Sie die aktuelle Uhrzeit (mit Millisekunden) mit C++ / C++11

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

Linux
  1. Wie drucke ich eine Variable mit Padded Center Alignment?

  2. Wie synchronisiert man die Zeit mit NTP auf dem Ubuntu-Server?

  3. So planen Sie Aufgaben mit at in Linux

  4. So erhalten Sie die gesamte CPU-Auslastung in Linux mit C++

  5. Wie fülle ich eine Datei mit FF mit dd auf?

So erhalten Sie das aktuelle Datum und die Uhrzeit in JavaScript

So automatisieren Sie tägliche Jobs unter Linux mit (at)

Wie drucke ich das Arbeitsverzeichnis mit dem Linux-Befehl pwd?

So durchsuchen Sie LDAP mit ldapsearch (mit Beispielen)

So richten Sie die Zeitsynchronisierung mit NTP unter Ubuntu 18.04 ein

So synchronisieren Sie die Zeit mit NTP in Linux mit dem Chrony-Tool