は、それはあなたのために十分に高速であれば知っているが、しないでください。私のために
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
std::cout << std::chrono::system_clock::now() << '\n';
}
だけ出力:
2017-03-02 17:04:26.813110
これは私が書いたライブラリです。フリーでオープンソースで、"date.h"
の部分はヘッダーのみです。 full documentationがあり、ビデオチュートリアルもあり、すべてGitHub pageからリンクされています。
かなり広範な書式設定と解析オプション、および時間とカレンダーの計算を安全に簡単に行う他の多くの機能があります。
また、このフォーマットが十分に速くない場合、ライブラリは柔軟に階層化されているため、低レベルで対話して自分のI/Oを簡単に書き込むことができます。たとえば、ここであなたはマイクロ秒の精度にsystem_clock::time_point
からint
としてフィールドタイプのすべてを得ることができる方法である。
#include "date.h"
int
main()
{
using namespace date;
using namespace std::chrono;
auto t = system_clock::now();
// Convert system_clock::time_point to days-precision time_point
auto sd = floor<days>(t);
// Create time_of_day
auto tod = make_time(t - sd);
// Create year_month_day
year_month_day ymd = sd;
// Extract field types as int
int y = int{ymd.year()}; // Note 1
int m = unsigned{ymd.month()};
int d = unsigned{ymd.day()};
int h = tod.hours().count();
int M = tod.minutes().count();
int s = tod.seconds().count();
int us = duration_cast<microseconds>(tod.subseconds()).count();
}
欲しいところが今、あなたはこれらのint
Sをフォーマットすることができます。
注1: gcc-6.1以前は、{}
に関するコンパイラのバグがあります。代わりに()
を使用して、コンパイラのバグを回避してください。 (int
秒からsystem_clock::time_point
に)逆方向に行く
はさらに簡単です:あなたが欲しいしかし
#include "date.h"
int
main()
{
using namespace date;
using namespace std::chrono;
int y = 2017;
int m = 3;
int d = 2;
int h = 15;
int M = 33;
int s = 55;
int us = 123456;
// Convert field values to system_clock::time_point
system_clock::time_point t = sys_days(year{y}/m/d) + hours{h} + minutes{M} +
seconds{s} + microseconds{us};
}
はあなたのint
Sを解析して、あなたは、単一のステートメントでsystem_clock::time_point
を形成することができます。
ライブラリにはアクティブなユーザーコミュニティがあり、複数のプラットフォームでこのライブラリを維持できます。
これは基本的に「私にライブラリを探す」問題です。しかし...C++ 20標準化の提案があることが判明しました。 'chrono'標準ライブラリコンポーネントの後ろにあったHoward Hinnantが作ったものです。彼は(私たちのために)実装するのに十分なほど素晴らしかったです(https://github.com/HowardHinnant/date);)。 –
@NicolBolas、それを答えに変えてみませんか? –
@D_N:これは閉じなければならない質問です。 –