2017-07-10 10 views
2

私はGMT日として出力std::chrono::time_pointにストリーム演算子を提供したい、私は現在、(のみostreamために簡略化)次き:basic_ostreamにユーザ定義のフォーマットフラグを "追加"するには?

using datetime_t = std::chrono::system_clock::time_point; 

std::ostream& operator<<(std::ostream &out, datetime_t dt) { 
    auto time = datetime_t::clock::to_time_t(dt); 
    auto under_sec = 
     std::chrono::duration_cast<std::chrono::milliseconds>(
      dt.time_since_epoch() % std::chrono::seconds{1}); 
    return out << std::put_time(std::gmtime(&time), "%Y-%m-%dT:%H:%M:%S") 
       << "." << std::setfill('0') << std::setw(3) << under_sec.count(); 
} 

使用法:

auto time = datetime_t::clock::now(); 
std::cout << time; 

これは動作しますが、それは強制的に

  • ハードコードされた形式を使用してください。
  • 出力ミリ秒。

私はカスタムストリームマニピュレータを提供したいと思います。カスタムマニピュレータを使用して、これらの両方を変更することができます。

std::cout << nm::us << time; 

...それはマイクロ秒までの印刷になります秒(マニピュレータを含む名前空間nmを想定)。

私はすでに

namespace nm { 
    std::ios_base& us(std::ios_base &) { /* ... */ } 
} 

:例えば、ストリームマニピュレータを作成する方法を知っている...しかし、私はどのように「ストア」への出力オペレータで使用するために必要な情報を知りません。

後でストリーム操作で使用するために情報をストリームに格納する単純な方法はありますか(ユーザー定義のフォーマットフラグ?)?やや同等の動作を得る別の方法?

+0

この場合、あなたが引数として時間を要する「マニピュレータ」をお勧めします。 –

+0

@Someprogrammerdudeこれはオプションになりますが、 'std :: cout << nm :: us(time);'を書く必要はありません(もしこれが意味するのであれば、あなたは何を話しているのか分かりません約 ;))。 – Holt

+0

はい、それは私が意味するものです。それは例えば何ですか? 'put_time'は、ストリームオブジェクトを変更しない他のマニピュレータを含みます。また、(標準)ストリームオブジェクトにカスタムデータやユーザーデータを追加する方法もありません。 –

答えて

2

あなたのコメントですでに見つかったように、ストリームにはiwordpwordのストレージがあります。世界で一番簡単なことではありませんが(設計された何十年もの間)、サービスは可能です。 (time_point_cast又はfloorで、すなわち出力の精度が入力の精度を調整することによって制御されるこのライブラリに

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    std::cout << format("%FT:%T", floor<microseconds>(system_clock::now())) << '\n'; 
} 

:別のオプションは、Howard Hinnant's free, open source, datetime library、このために既に符号化されたライブラリを使用することであろう

)。

出力例:

2017-07-10T:11:46:59.354321 
+0

ありがとう、私はすでにあなたの(素晴らしい)日時ライブラリを知っていましたが、私はより一般的な方法を望んでいました - 私はdatetimeの例を提供しましたが、実際には他のタイプ(これは様々なユニットを表しています) – Holt

関連する問題