とりあえずGCC4.8にこだわっています。現在の時刻を秒以外で印刷したい。 put_time
が機能した場合、私のコードは次のような単純なものになります。
std::cout << std::setw(24) << std::put_time(c_time, "[%T%z %F] ");
put_time
がないと、c_time
の要素に手動でアクセスし、すべてのフォーマットを手動で行う必要があります。これはa **の苦痛であり、可能であれば避けたいものです。これはではないことに注意してくださいは、間接的であっても、Cと対話したくないことを意味します-可能であれば、Cで直接コーディングすることは避けたいと思います。
ただし、strftime
を除いて、std::put_time
に代わるものは見つかりません。これは、コードのほぼ2行が必要であり、少なくとも私にとっては非常に読みにくいため、避けたいと思います。また、これはCではなくC++なので、可能な限りC関数を避けたいと思います。
私は何かが足りないのですか? GCC 4.8で動作するstd::put_time
の組み込みの代替手段はありますか?
まったく同じように機能する必要はないことに注意してください。たとえば、ストリームマニピュレータではなく、出力に直接出力する場合は、std::string
を返す関数と同様に、まったく問題ありません。フォーマットされた時間を含みます。
グーグルをかなり行って、 <chrono>
を見つけましたが、時間を自動的にフォーマットするものがないため、機能しません。私はまだ手動でそれをしなければならないでしょう、そして私はエポックからの秒数を解析しなければならないので、それはもっと働くだろうとかなり確信しています年、月、日など。
chrono
または iomanip
で提供される時間の出力には、 put_time
以外の関数はありません。図書館。
ctime
ライブラリは以下を提供します: strftime
、 ctime
、および asctime
。
http://stackoverflow.com は、3を見つけることについての質問を許可しないためrd パーティーライブラリ、私はあなたが誰かにstrftime
の使用についてあなたに指示するように頼んでいるだけだと思いますか? std::put_time(c_time, "[%T%z %F] ")
は次の形式で記述できます。
char foo[24];
if(0 < strftime(foo, sizeof(foo), "[%T%z %F] ", c_time)) cout << foo << endl;
また、これはCではなくC++なので、可能な限りC関数を避けたいと思います。
それはかなりばかげた考え方です。 _put_time
_は、内部で_std::strftime
_を使用します。
戻り値:指定されていないタイプのオブジェクト...ここで、関数
f
は次のように定義されています。
_template <class charT, class traits>
void f(basic_ios<charT, traits>& str, const struct tm* tmb, const charT* fmt) {
/* ... */
typedef time_put<charT, Iter> TimePut;
/* ... */
}
_
そして、_time_put
_の定義は locale.time.put.virtuals#1 にあります:
効果:パラメータ
t
の内容を出力シーケンスs
に配置された文字にフォーマットします。フォーマットは、パラメータformatと修飾子によって制御され、標準ライブラリ関数strftime()
..の文字列引数のフォーマット指定子と同じように解釈されます。