Cómo obtener la marca de tiempo actual en milisegundos desde 1970 de la misma manera que Java obtiene


En Java, podemos usar System.currentTimeMillis() para obtener la marca de tiempo actual en milisegundos desde epoch time que es -

La diferencia, medida en milisegundos, entre el tiempo actual y medianoche, 1 de enero de 1970 UTC.

En C++ ¿ cómo obtener lo mismo?

Actualmente estoy usando esto para obtener la marca de tiempo actual -

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

¿Esto parece correcto o no?

5 answers

Si tiene acceso a las bibliotecas de C++ 11, eche un vistazo a std::chrono biblioteca. Puede usarlo para obtener los milisegundos desde la época de Unix de esta manera:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);
 157
Author: Oz.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-28 18:28:08

Use <sys/time.h>

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

Refiérase a esto .

 32
Author: Trying,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:06

Si usa gettimeofday tiene que lanzar a long long de lo contrario obtendrá desbordamientos y por lo tanto no el número real de milisegundos desde la época: long int msint = tp. tv_sec * 1000 + tp. tv_usec / 1000; te dará un número como 767990892 que es redondo 8 días después de la época ;-).

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}
 11
Author: rli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 06:42:18

Esta respuesta es bastante similar a Oz.es , usando <chrono> para C++ 't no lo cogí de Oz. aunque...

Recogí el fragmento original en la parte inferior de esta página, y lo modificé ligeramente para que fuera una aplicación de consola completa. Me encanta usar esta pequeña cosa. Es fantástico si hace mucho scripting y necesita una herramienta confiable en Windows para obtener el epoch en milisegundos reales sin recurrir al uso de VB, o algún código menos moderno y menos fácil de leer.

#include <chrono>
#include <iostream>

int main() {
    __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}
 9
Author: kayleeFrye_onDeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

Incluye <ctime> y usa la función time.

 -19
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-24 01:10:06