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

135

En Java, nous pouvons utiliser System.currentTimeMillis()pour obtenir l'horodatage actuel en millisecondes depuis l'heure de 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, j'utilise ceci 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 correct ou pas?

AKIWEB
la source

Réponses:

239

Si vous avez accès aux bibliothèques C ++ 11, consultez la std::chronobibliothèque. 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()
);
Oz.
la source
92
Agréable. Ajoutez count () à la fin de la ligne pour obtenir le nombre de millisecondes dans un format de type fondamental.
P1r4nh4
1
@lining: Les deux époques sont probablement identiques, mais leurs valeurs peuvent être différentes. steady_clockprogressera toujours en avant, c'est une vraie mesure du temps depuis son époque alors qu'elle system_clockpeut être une représentation du temps logique depuis l'époque. Pour chaque seconde intercalaire, les deux pourraient s'éloigner davantage en fonction de la mise en œuvre du système.
Oz.
4
Autant que je sache, l'époque de chacune des horloges dépend de la mise en œuvre. La convention est system_clockla même que celle de l'époque UNIX, mais la spécification dit seulement qu'il doit s'agir de l'horloge murale en temps réel du système. Il n'est pas nécessaire que le steady_clockcorresponde à la réalité, seulement qu'il ne fasse que progresser.
Oz.
1
@Jason Outre que gettimeofday n'est pas disponible sous Windows, la bibliothèque chrono peut vous donner une résolution plus élevée (gtod est limité aux microsecondes), fournit des unités de temps de manière sécurisée afin que le compilateur puisse appliquer les conversions d'unités et fonctionne avec les opérateurs arithmétiques normaux ( ajouter des timevalstructures est ennuyeux).
Oz.
3
Les développeurs Javascript se
moquent de
42

utilisation <sys/time.h>

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

renvoyer ceci .

En essayant
la source
bonne solution, aussi je pense que ça devrait être gettimeofday (& tp, NULL);
Adem
4
Tout d'abord, c'est C, pas C ++. Deuxièmement, il y a des problèmes avec gettimeofday, voyez ceci par exemple.
rustyx
18

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

J'ai pris l'extrait d'origine au bas de cette page et je l'ai légèrement modifié pour en faire une application console complète. J'adore utiliser ce petit truc. C'est fantastique si vous faites beaucoup de scripts et que vous avez besoin d'un outil fiable dans Windows pour obtenir l'époque en millisecondes réelles sans recourir à VB, ou à un 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;
}
kayleeFrye_onDeck
la source
J'obtiens un nombre négatif, -560549313ce n'est pas juste, non?
Noitidart
1
@Noitidart Pouvez-vous me dire quelle plate-forme et compilateur C ++ vous utilisez? J'utilise ce truc tout le temps avec des outils d'automatisation, et je n'ai jamais vu de sortie négative o.0 Plus qu'heureux de le vérifier. Est-ce également une copie directe ou un programme modifié / intégré? Je veux juste vous assurer qu'il provient uniquement de ce code.
kayleeFrye_onDeck
5
Ah @kayleeFrye_onDeck c'est parce que je l'utilisais int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. J'ai changé ça int64_tet ça marche! Merci beaucoup d'avoir demandé plus d'informations pour vous aider!
Noitidart
unsigned long longest plus portable et __int64n'est disponible que sur MSVC.
SS Anne le
il n'y a pas de __int64type en C ++ standard. On peut utiliser à la std::int64_tplace.
jaskmar le
15

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

  • obtenir l'heure système actuelle: std::chrono::system_clock::now()
  • obtenir le temps depuis l'époque: .time_since_epoch()
  • traduire l'unité sous-jacente en millisecondes: duration_cast<milliseconds>(d)
  • traduire std::chrono::millisecondsen entier ( uint64_tpour éviter le débordement)
#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;
}
Alessandro Pezzato
la source
Je suggère d'utiliser unsigned long longau lieu de uint64_t.
csg
Pourquoi unsigned long longau lieu de uint64_t? J'ai une préférence naturelle pour le type plus court à taper
Jawad il y a
13

Si vous utilisez gettimeofday, vous devez lancer un long long sinon vous aurez des débordements et donc pas le nombre réel de millisecondes 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;
}
rli
la source
-25

Incluez <ctime>et utilisez la timefonction.

Owen
la source
31
Cela renvoie les secondes depuis l'époque. Pas des millisecondes.
Progo