web-dev-qa-db-ja.com

std :: chrono :: time_pointを文字列に変換する方法

変換方法std::chrono::time_point文字列に?例えば: "201601161125"

15
Seihyung Oh

そうするための最も柔軟な方法は、それを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`

strftimehere のドキュメントを参照してください。

localtime_sまたはlocaltime_rを使用できる場合は、localtimeよりもどちらかを使用する必要があります。

これを行う方法は他にもたくさんありますが、ほとんどの場合はより使いやすいものですが、これらによりいくつかの定義済みの文字列表現が得られます。使いやすくするために、関数内で上記のすべてを「隠す」ことができます。

7

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
12
Howard Hinnant

コードソリューション

次の関数は、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()

テクニカルvsユーザーフレンドリーなシリアライゼーション

技術的な使用については、ハードコードされた時間形式が適切なソリューションです。ただし、ユーザーに表示するには、localeを使用してユーザー設定を取得し、その形式でタイムスタンプを表示する必要があります。

C++ 20

C++ 20以降、time_pointとdurationのNiceシリアライゼーションおよび解析関数があります。

  • _std::chrono::to_stream_
  • _std::chrono::format_
0
Adrian Maire