web-dev-qa-db-fra.com

Comment obtenir l’horodatage actuel en millisecondes depuis 1970 exactement comme Java

En Java, nous pouvons utiliser System.currentTimeMillis() pour obtenir l’horodatage actuel en millisecondes depuis l’époque qui est -

la différence, mesurée en millisecondes, entre l'heure actuelle et minuit, le 1er janvier 1970 UTC.

En C++, comment obtenir la même chose?

Actuellement, je l'utilise pour obtenir l'horodatage actuel -

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;

Cela semble juste ou pas?

109
AKIWEB

Si vous avez accès aux bibliothèques C++ 11, consultez la bibliothèque std::chrono . Vous pouvez l'utiliser pour obtenir les millisecondes depuis l'époque Unix comme ceci:

_#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_Epoch()
);
_
198
Oz.

utiliser <sys/time.h>

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

se référer this .

37
Trying

Cette réponse est assez similaire à Oz. , en utilisant <chrono> pour C++ - je ne l'ai pas saisie d'Oz. bien que...

J'ai récupéré l'extrait de code original au bas de cette page et l'ai légèrement modifié pour qu'il devienne une application de console complète. J'aime utiliser ce petit truc. C'est fantastique si vous utilisez beaucoup de scripts et que vous avez besoin d'un outil fiable sous Windows pour obtenir Epoch en quelques millisecondes sans recourir à VB, ou à du code moins moderne et moins convivial.

#include <chrono>
#include <iostream>

int main() {
    unsigned __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;
}
13
kayleeFrye_onDeck

Si vous utilisez gettimeofday, vous devez lancer trop longtemps, sinon vous obtiendrez des débordements et donc pas le nombre réel de millisecondes écoulées depuis l'époque: long int msint = tp.tv_sec * 1000 + tp.tv_usec/1000; vous donnera un numéro comme 767990892 qui est rond 8 jours après l’époque ;-).

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;
}
12
rli

Depuis C++ 11, vous pouvez utiliser std::chrono:

  • obtenir l'heure actuelle du système: std::chrono::system_clock::now()
  • obtenir le temps depuis Epoch: .time_since_Epoch()
  • traduire l'unité sous-jacente en millisecondes: duration_cast<milliseconds>(d)
  • traduire std::chrono::milliseconds en entier (uint64_t pour éviter les débordements)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_Epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}
2