web-dev-qa-db-fra.com

Quand est std :: chrono epoch?

std::chrono::time_point::time_since_Epoch() renvoie un duration, référencé à certains time_point autrefois. Quand est-ce un time_point? Cela dépend de l'implémentation C++ ou est-il défini par la norme C++? Ou est-ce une norme de facto de fixer l'Epoque au 1er janvier 1970 UTC?

27
Paolo M

C'est une fonction à la fois du clock spécifique auquel time_point Fait référence et de l'implémentation de ce clock. La norme spécifie trois horloges différentes:

  • system_clock
  • steady_clock
  • high_resolution_clock

Et la norme ne spécifie pas l'époque pour aucune de ces horloges.

Les programmeurs (vous) peuvent également créer leurs propres horloges, qui peuvent ou non spécifier une époque.

Il existe une norme de facto (non officielle) selon laquelle std::chrono::system_clock::time_point A une époque cohérente avec nix Time . Ceci est défini comme la durée qui s'est écoulée depuis 00:00:00 temps universel coordonné (UTC), jeudi 1er janvier 1970, sans compter les secondes intercalaires.

Fwiw, voici une bibliothèque date/heure qui tire parti de cette norme de facto.

Il n'y a pas de standard de facto pour les deux autres horloges spécifiées std. De plus, high_resolution_clock Peut être un alias de type pour system_clock Ou steady_clock.

Sous OS X, high_resolution_clock Est un alias de type pour steady_clock Et steady_clock Est un décompte de nanosecondes depuis le démarrage de l'ordinateur (aucune relation avec UTC).

Mise à jour

Le projet de spécification C++ 2a dit maintenant pour system_clock:

Les objets de type sys_time<Duration> Mesurent le temps écoulé depuis (et avant) 1970-01-01 00:00:00 UTC à l'exclusion des secondes intercalaires. Cette mesure est communément appelée heure Unix. Cette mesure facilite une mise en correspondance efficace entre sys_time Et les types de calendrier (27.8). [ Exemple: sys_seconds{sys_days{1970y/January/1}}.time_since_Epoch() est 0s. sys_seconds{sys_days{2000y/January/1}}.time_since_Epoch() est 946’684’800s, qui est 10’957 * 86’400s. - fin de l'exemple]

De plus, C++ 2a introduit utc_clock, tai_clock, gps_clock Et file_clock. Ces horloges ont également des époques bien définies car on peut clock_casttime_point S d'une horloge à l'autre parmi celles-ci et system_clock.

L'époque file_clock Ne sera pas portable, mais vous pourrez toujours relier ses time_point Au calendrier civil.

utc_clock Est comme system_clock, Sauf qu'il n'ignore pas les secondes intercalaires. Par exemple:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto s1 = sys_days{December/31/2016} + 23h + 59min + 59s;
    auto s2 = sys_days{January/1/2017};
    auto u1 = clock_cast<utc_clock>(s1);
    auto u2 = clock_cast<utc_clock>(s2);
    std::cout << s2 - s1 << '\n';
    std::cout << u2 - u1 << '\n';
}

Les sorties:

1s
2s

Mettre à jour

Lien vers le maintenant spécifié (C++ 20) system_clock Epoch: http://eel.is/c++draft/time.clock.system#overview-1

Les objets de type system_­clock Représentent l'heure de l'horloge murale à partir de l'horloge en temps réel à l'échelle du système. Les objets de type sys_­time<Duration> Mesurent le temps depuis le 1970-01-01 00:00:00 UTC hors secondes intercalaires. Cette mesure est communément appelée temps Unix. Cette mesure facilite une mise en correspondance efficace entre sys_­time Et les types de calendrier ([time.cal]). [ Exemple:sys_­seconds{sys_­days{1970y/January/1}}.time_­since_­Epoch() est 0s. sys_­seconds{sys_­days{2000y/January/1}}.time_­since_­Epoch() est 946'684'800s, qui est 10'957 * 86'400s. — fin exemple]

41
Howard Hinnant