GNU/Linux >> Linux Esercitazione >  >> Linux

Come stampare l'ora corrente (con millisecondi) usando C++ / C++11

Non perdere tempo con Boost (so che molti saranno offesi da questa affermazione e la considereranno un'eresia).

Questa discussione contiene due soluzioni molto praticabili che non richiedono di asservirti a librerie di terze parti non standard.

C++ ottiene tempo in millisecondi su Linux -- clock() non sembra funzionare correttamente

http://linux.die.net/man/3/clock_gettime

I riferimenti a gettimeofday possono essere trovati qui su opengroup.org


Puoi utilizzare Posix Time di Boost .

Puoi usare boost::posix_time::microsec_clock::local_time() per ottenere l'ora corrente dall'orologio con risoluzione in microsecondi:

boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();

Quindi puoi calcolare l'offset orario nel giorno corrente (poiché l'output della durata è nella forma <hours>:<minutes>:<seconds>.<milliseconds> , presumo che siano calcolati come offset del giorno corrente; in caso contrario, sentiti libero di utilizzare un altro punto di partenza per durata/intervallo di tempo):

boost::posix_time::time_duration td = now.time_of_day();

Quindi puoi usare .hours() , .minutes() , .seconds() funzioni di accesso per ottenere i valori corrispondenti.
Sfortunatamente, non sembra esserci un .milliseconds() funzione di accesso, ma c'è un .total_milliseconds() uno; quindi puoi fare una piccola sottrazione matematica per formattare i restanti millisecondi nella stringa.

Quindi puoi usare sprintf() (o sprintf()_s se sei interessato al codice solo VC++ non portatile) per formattare quei campi in un char non elaborato buffer e avvolgere in modo sicuro questo buffer di stringa C non elaborato in un std::string robusto e conveniente esempio.

Vedere il codice commentato di seguito per ulteriori dettagli.

L'output nella console è qualcosa del tipo:

11:43:52.276

Codice di esempio:

///////////////////////////////////////////////////////////////////////////////

#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';    
}

///////////////////////////////////////////////////////////////////////////////

Ecco una soluzione che ho trovato senza usare 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. Come stampare una variabile con allineamento centrale imbottito?

  2. Come pianificare le attività utilizzando in Linux

  3. Come si crea una finestra in Linux con C++?

  4. Stampa dell'ora corrente in millisecondi o nanosecondi con printf incorporato

  5. In Linux come creare un file con un nome che sia la data e l'ora correnti

Come ottenere la data e l'ora correnti in JavaScript

Come automatizzare i lavori giornalieri su Linux usando (at)

Come stampare la directory di lavoro usando il comando pwd di Linux?

Come cercare LDAP usando ldapsearch (con esempi)

Come impostare la sincronizzazione dell'ora con NTP su Ubuntu 18.04

Come sincronizzare l'ora con NTP in Linux utilizzando Chrony Tool