2014年6月30日月曜日

std::chrono::steady_clock to ISO8601

こんな具合で std::chrono::steady_clock から ISO8601 の時刻を表す文字列を得られます。

途中で妙な細工をしています。
const auto ct = system_clock::to_time_t( system_clock::now() + ( t - steady_clock::now() ) );
const time_t ct
( ( duration_cast< seconds >( system_clock::now( ).time_since_epoch( ) )
  + duration_cast< seconds >( t - steady_clock::now( ) )
  ).count( )
);

steady_clock から ::now() で得た time_point に time_since_epoch をしても意図したエポックからの経過時間は得られません。そのため、 system_clock::now() と t が保持する時刻と steady_clock::now() の差からエポックからの経過時間を得ます。

(記事公開時の初期の打ち消し線のリビジョンではg++-4.8.2、clang++-3.3では問題ありませんでしたが、em++-1.20.0でコンパイルエラーになる事から、きっちり duration_cast で seconds に合わせるように修正しました。)

はじめから steady_clock を使うつもりなら、こういう覚悟もできると思うのですが、環境によっては high_resolution_clock が steady_clock に置き換えられて処理されます。そして、同じ環境でも g++ では high_resolusion_clock が system_clock と同様の値を返したり、  clang++ ではsteady_clock と同様の値を返したり、 また別の環境の clang++ では system_clock と同様の値を返したり(´・ω:;.:...


そのような次第で、 steady_clock や high_resolution_clock からエポックからの経過時間を得たい場合には上記のようなひと手間をコードしておかないと事故に遭う模様です。


参考

0 件のコメント:

コメントを投稿