web-dev-qa-db-fra.com

Obtenez le temps depuis Epoch en millisecondes, de préférence en utilisant C ++ 11 chrono

Tout ce que je veux, c'est obtenir le temps depuis Epoch en millisecondes et le stocker dans un long non signé.

J'ai trouvé cette question connexe . Mais honnêtement, cela ne peut pas être le moyen le plus simple d'effectuer une tâche aussi simple, n'est-ce pas? J'espère quelque chose de beaucoup plus simple, mais je ne trouve rien dans la référence std :: chrono . Tout conseil est le bienvenu. Je ne dois pas nécessairement utiliser std::chrono, mais je veux qu'il soit indépendant de la plate-forme.

43
Haatschii
unsigned long milliseconds_since_Epoch =
    std::chrono::system_clock::now().time_since_Epoch() / 
    std::chrono::milliseconds(1);

bien que, d'autant plus que vous souhaitez l'indépendance de la plate-forme, il peut être préférable de remplacer unsigned long par un type plus susceptible d'être suffisamment grand:

  • (unsigned) long long
  • std::(u)int64_t
  • std::chrono::milliseconds::rep
  • auto

Pour moi, cela indique clairement à la fois que vous risquez une perte de précision (par analogie avec une division entière) et que vous quittez la sécurité du système de type (en divisant par un temps tapé pour donner un nombre sans unité). Cependant, comme démontré dans les commentaires, certaines personnes diraient que toute tentative de s'éloigner de la sécurité de type devrait être accompagnée d'une tentative délibérée de rendre le code dangereux. Si vous avez besoin de traiter avec des personnes qui partagent cette croyance, il pourrait être plus simple d'utiliser duration_cast Plutôt que d'entrer dans un argument concernant des choix stylistiques non pertinents:

unsigned long milliseconds_since_Epoch = 
    std::chrono::duration_cast<std::chrono::milliseconds>
        (std::chrono::system_clock::now().time_since_Epoch()).count();
76
Mike Seymour