GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo imprimir la hora actual (con milisegundos) usando C++ / C++11

No pierdas tu tiempo con Boost (sé que muchos se ofenderán por esta afirmación y la considerarán una herejía).

Esta discusión contiene dos soluciones muy viables que no requieren que te esclavices a bibliotecas de terceros no estándar.

C++ obteniendo milisegundos de tiempo en Linux -- clock() parece no funcionar correctamente

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

Las referencias a gettimeofday se pueden encontrar aquí en opengroup.org


Puedes usar Tiempo Posix de Boost .

Puedes usar boost::posix_time::microsec_clock::local_time() para obtener la hora actual del reloj con resolución de microsegundos:

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

Luego puede calcular la compensación de tiempo en el día actual (ya que su salida de duración tiene la forma <hours>:<minutes>:<seconds>.<milliseconds> , supongo que se calculan como compensación del día actual; si no lo son, siéntase libre de usar otro punto de partida para duración/intervalo de tiempo):

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

Entonces puedes usar .hours() , .minutes() , .seconds() accesorios para obtener los valores correspondientes.
Desafortunadamente, no parece haber un .milliseconds() accesor, pero hay un .total_milliseconds() una; por lo que puede hacer una pequeña resta matemática para obtener los milisegundos restantes para formatear en la cadena.

Entonces puedes usar sprintf() (o sprintf()_s si está interesado en el código solo VC++ no portátil) para formatear esos campos en un char sin formato y envuelva de forma segura este búfer de cadena C sin procesar en un std::string robusto y conveniente instancia.

Consulte el código comentado a continuación para obtener más detalles.

La salida en la consola es algo así como:

11:43:52.276

Código de muestra:

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

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

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

Aquí hay una solución que encontré sin usar 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. Cómo obtener el uso total de la CPU en Linux usando C++

  2. ¿Cómo obtener un seguimiento de pila para C ++ usando gcc con información de número de línea?

  3. Cómo imprimir miembros de un objeto C++ usando GDB desde una dirección si el tipo de clase del objeto es como A::B

  4. Imprimir la hora actual en milisegundos o nanosegundos con printf incorporado

  5. En Linux, cómo crear un archivo con un nombre que sea la fecha y hora actuales

Cómo obtener la fecha y hora actuales en JavaScript

Cómo automatizar trabajos diarios en Linux usando (at)

¿Cómo imprimir el directorio de trabajo usando el comando pwd de Linux?

Cómo buscar LDAP usando ldapsearch (con ejemplos)

Cómo configurar la sincronización de tiempo con NTP en Ubuntu 18.04

Cómo sincronizar la hora con NTP en Linux usando la herramienta Chrony