変換方法std::chrono::time_point
文字列に?例えば: "201601161125"
。
そうするための最も柔軟な方法は、それをstruct tm
に変換し、次にstrftime
を使用することです(これは、時間についてはsprintf
に似ています)。何かのようなもの:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_c);
/// now you can format the string as you like with `strftime`
strftime
here のドキュメントを参照してください。
localtime_s
またはlocaltime_r
を使用できる場合は、localtime
よりもどちらかを使用する必要があります。
これを行う方法は他にもたくさんありますが、ほとんどの場合はより使いやすいものですが、これらによりいくつかの定義済みの文字列表現が得られます。使いやすくするために、関数内で上記のすべてを「隠す」ことができます。
Howard Hinnantの無料のオープンソース、ヘッダーのみの、ポータブルな日付/時刻ライブラリ は、これを行うための最新の方法であり、古いC APIを介してトラフィックを送らず、すべてを破棄する必要はありません。あなたのサブセカンド情報の。このライブラリも 標準化の提案 です。
書式設定には多くの柔軟性があります。最も簡単な方法は、ストリーミングすることです。
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
std::cout << std::chrono::system_clock::now() << '\n';
}
これはちょうど私のために出力します:
2017-09-15 13:11:34.356648
using namespace date;
のストリーミングオペレーターを見つけるには、system_clock::time_point
が必要です(私のライブラリがnamespace std::chrono
に挿入することはできません)。この形式で情報が失われることはありません。system_clock::time_point
の完全な精度が出力されます(macOSでこれを実行した場所ではmicroseconds
)。
strftime
- like formating flags の完全なスイートは、小数秒などを処理するためのマイナーな拡張機能を備えた他のフォーマットで使用できます。次に、ミリ秒の精度で出力する別の例を示します。
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << format("%D %T %Z\n", floor<milliseconds>(system_clock::now()));
}
私のために出力するだけです:
09/15/17 13:17:40.466 UTC
次の関数は、chrono
_time_point
_から文字列(シリアル化)に変換します。
_#include <chrono>
#include <iomanip>
#include <sstream>
using time_point = std::chrono::system_clock::time_point;
std::string serializeTimePoint( const time_point& time, const std::string& format)
{
std::time_t tt = std::chrono::system_clock::to_time_t(time);
std::tm tm = *std::gmtime(&tt); //GMT (UTC)
//std::tm tm = *std::localtime(&tt); //Locale time-zone, usually UTC by default.
std::stringstream ss;
ss << std::put_time( &tm, format.c_str() );
return ss.str();
}
// example
int main()
{
time_point input = std::chrono::system_clock::now();
std::cout << serializeTimePoint(input, "UTC: %Y-%m-%d %H:%M:%S") << std::endl;
}
_
_time_point
_データ型にはタイムゾーンの内部表現がないため、タイムゾーンは_std::tm
_への変換によって(関数gmtime
またはlocaltime
によって)集計されます。 _%Z
_で誤ったタイムゾーンが表示されるため、入力からタイムゾーンを追加/減算することはお勧めしません。したがって、正しいローカル時間(OSに依存)を設定して使用することをお勧めします。 localtime()
。
技術的な使用については、ハードコードされた時間形式が適切なソリューションです。ただし、ユーザーに表示するには、locale
を使用してユーザー設定を取得し、その形式でタイムスタンプを表示する必要があります。
C++ 20以降、time_pointとdurationのNiceシリアライゼーションおよび解析関数があります。
std::chrono::to_stream
_std::chrono::format
_