web-dev-qa-db-ja.com

std :: chrono epochはいつですか?

std::chrono::time_point::time_since_Epoch()は、過去にtime_pointと呼ばれていたdurationを返します。そのようなtime_pointはいつですか?それはC++の実装に依存していますか、それともC++標準で定義されていますか?または、エポックを1970年1月1日UTCに設定することは事実上の標準ですか?

27
Paolo M

これは、_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_です。 —例を終了]

41
Howard Hinnant