std::chrono::time_point::time_since_Epoch()
は、過去にtime_point
と呼ばれていたduration
を返します。そのようなtime_point
はいつですか?それはC++の実装に依存していますか、それともC++標準で定義されていますか?または、エポックを1970年1月1日UTCに設定することは事実上の標準ですか?
これは、_time_point
_が参照する特定のclock
と、そのclock
の実装の両方の関数です。この規格では、3つの異なるクロックを指定しています。
system_clock
_steady_clock
_high_resolution_clock
_そして、規格はこれらのクロックのいずれにもエポックを指定していません。
プログラマー(あなた)は、独自の時計を作成することもできます。
_std::chrono::system_clock::time_point
_が nix Time と一致するエポックを持つという事実上の(非公式の)標準があります。これは、1970年1月1日木曜日の00:00:00協定世界時(UTC)から経過した時間として定義され、うるう秒はカウントされません。
Fwiw、 これは日付/時刻ライブラリです これは、この事実上の標準を利用しています。
他の2つのstd指定クロックには、事実上の標準はありません。さらに、_high_resolution_clock
_は、_system_clock
_または_steady_clock
_の型エイリアスとして許可されています。
OS Xでは、_high_resolution_clock
_は_steady_clock
_の型エイリアスであり、_steady_clock
_はコンピューターが起動してからのナノ秒数です(UTCとはまったく関係ありません)。
更新
ドラフトC++ 2a仕様は、_system_clock
_について次のように述べています。
タイプ_
sys_time<Duration>
_のオブジェクトは、1970-01-01 00:00:00 UTC以降(うるう秒を除く)からの時間を測定します。この測定値は一般にUnix時間と呼ばれます。この方法により、_sys_time
_とカレンダータイプ(27.8)の間の効率的なマッピングが容易になります。 [例:sys_seconds{sys_days{1970y/January/1}}.time_since_Epoch()
は_0s
_です。sys_seconds{sys_days{2000y/January/1}}.time_since_Epoch()
は_946’684’800s
_、つまり_10’957 * 86’400s
_です。 —終了例]
さらに、C++ 2aは_utc_clock
_、_tai_clock
_、_gps_clock
_および_file_clock
_を導入しています。これらのクロックには、明確に定義されたエポックもあります。これらのクロック間で_clock_cast
_ _time_point
_ sおよび_system_clock
_を実行できるからです。
_file_clock
_エポックは移植できませんが、その_time_point
_ sを通常のカレンダーに関連付けることはできます。
_utc_clock
_は、うるう秒を無視しないことを除いて、_system_clock
_に似ています。例えば:
_#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';
}
_
出力:
_1s
2s
_
現在指定されている(C++ 20)_system_clock
_ Epochへのリンク: http://eel.is/c++draft/time.clock.system#overview-1
タイプ_
system_clock
_のオブジェクトは、システム全体のリアルタイムクロックからの実時間を表します。タイプ_sys_time<Duration>
_のオブジェクトは、うるう秒を除く1970-01-01 00:00:00 UTC以降の時間を測定します。このメジャーは一般にUnix時間と呼ばれます。この方法により、_sys_time
_とカレンダータイプ([time.cal])の間の効率的なマッピングが容易になります。 [例:sys_seconds{sys_days{1970y/January/1}}.time_since_Epoch()
は_0s
_です。sys_seconds{sys_days{2000y/January/1}}.time_since_Epoch()
は_946'684'800s
_、つまり_10'957 * 86'400s
_です。 —例を終了]