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?
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 entresys_time
Et les types de calendrier (27.8). [ Exemple:sys_seconds{sys_days{1970y/January/1}}.time_since_Epoch()
est0s
.sys_seconds{sys_days{2000y/January/1}}.time_since_Epoch()
est946’684’800s
, qui est10’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_cast
time_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
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 typesys_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 entresys_time
Et les types de calendrier ([time.cal]). [ Exemple:sys_seconds{sys_days{1970y/January/1}}.time_since_Epoch()
est0s
.sys_seconds{sys_days{2000y/January/1}}.time_since_Epoch()
est946'684'800s
, qui est10'957 * 86'400s
. — fin exemple]