2011-07-18 13 views
50

En mi hilo (utilizando impulso :: hilo) que necesito para recuperar la hora actual en ms o menos y para convertir en ms:obtiene la hora actual en milisegundos usando C++ y Boost

En realidad, la lectura aquí Me he encontrado esto:

tick = boost::posix_time::second_clock::local_time(); 
now = boost::posix_time::second_clock::local_time(); 

Y parece que funciona, pero después tengo que tener mucho valor de los milisegundos del ahora ...

¿Cómo puedo hacerlo?

+1

Qué quiere decir una marca de tiempo época? – Nim

+6

"pero después necesito tener un valor largo de los milisegundos del ahora". ....¿qué? –

Respuesta

66

Puede usar boost::posix_time::time_duration para obtener el rango de tiempo. Por ejemplo,

boost::posix_time::time_duration diff = tick - now; 
diff.total_milliseconds(); 

Y para obtener una mayor resolución, puede cambiar el reloj que está utilizando. Por ejemplo, al boost::posix_time::microsec_clock, aunque esto puede depender del sistema operativo. En Windows, por ejemplo, boost::posix_time::microsecond_clock tiene una resolución de milisegundos, no de microsegundos.

Un ejemplo que depende un poco del hardware.

int main(int argc, char* argv[]) 
{ 
    boost::posix_time::ptime t1 = boost::posix_time::second_clock::local_time(); 
    boost::this_thread::sleep(boost::posix_time::millisec(500)); 
    boost::posix_time::ptime t2 = boost::posix_time::second_clock::local_time(); 
    boost::posix_time::time_duration diff = t2 - t1; 
    std::cout << diff.total_milliseconds() << std::endl; 

    boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time(); 
    boost::this_thread::sleep(boost::posix_time::millisec(500)); 
    boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time(); 
    boost::posix_time::time_duration msdiff = mst2 - mst1; 
    std::cout << msdiff.total_milliseconds() << std::endl; 
    return 0; 
} 

En mi máquina win7. La primera salida es 0 o 1000. Segunda resolución. El segundo es casi siempre 500, debido a la mayor resolución del reloj. Espero que ayudes un poco.

+3

gracias, pero si, por ejemplo, necesito enviar el ahora en milisegundos, ¿cómo puedo hacer esto? – ghiboz

+1

Creo que podría hacer con algunas declaraciones 'using' –

+2

@ghiboz: [boost :: chrono :: high_resolution_clock] (http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/reference. html # chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock) –

12

Si se refiere a milisegundos desde el periodo que podría hacer

ptime time_t_epoch(date(1970,1,1)); 
ptime now = microsec_clock::local_time(); 
time_duration diff = now - time_t_epoch; 
x = diff.total_milliseconds(); 

Sin embargo, no es particularmente claro lo que está buscando.

Tenga una mirada en el ejemplo en la documentación de DateTime en Boost Date Time

+5

+1 Además, tenga en cuenta que aquí la fecha es de tipo boost :: gregorian :: date – ntg

-8

Prueba esto: los encabezados de importación como se ha mencionado .. da segundos y milisegundos solamente. Si necesita explicar el código, lea this link.

#include <windows.h> 

#include <stdio.h> 

void main() 
{ 

    SYSTEMTIME st; 
    SYSTEMTIME lt; 

    GetSystemTime(&st); 
    // GetLocalTime(&lt); 

    printf("The system time is: %02d:%03d\n", st.wSecond, st.wMilliseconds); 
    // printf("The local time is: %02d:%03d\n", lt.wSecond, lt.wMilliseconds); 

} 
+4

esta es una solución basada en Windows. Sería mejor ofrecer una solución multiplataforma –

+4

Esto no tiene nada que ver con el impulso. – Qix

6
// Get current date/time in milliseconds. 
#include "boost/date_time/posix_time/posix_time.hpp" 
namespace pt = boost::posix_time; 

int main() 
{ 
    pt::ptime current_date_microseconds = pt::microsec_clock::local_time(); 

    long milliseconds = current_date_microseconds.time_of_day().total_milliseconds(); 

    pt::time_duration current_time_milliseconds = pt::milliseconds(milliseconds); 

    pt::ptime current_date_milliseconds(current_date_microseconds.date(), 
             current_time_milliseconds); 

    std::cout << "Microseconds: " << current_date_microseconds 
       << " Milliseconds: " << current_date_milliseconds << std::endl; 

    // Microseconds: 2013-Jul-12 13:37:51.699548 Milliseconds: 2013-Jul-12 13:37:51.699000 
} 
Cuestiones relacionadas