何のための次善の策だろうstrptime
、我々はmillissecondsと日時文字列を持っている場合?
与えられた:
"30/03/09 16:31:32.121"
ミリ秒をstruct tm
保存しないため、通常のstrptimeを使用できません。これを達成できる新しいクラスはありますか?
これらのフィールドを手動で解析し(intに読み取り、秒を2倍にします)、days_from_civilを使用して年/月/日をchrono::system_clock::time_point
:に変換します。
std::chrono::system_clock::time_point t(days(days_from_civil(y, m, d)));
ここdays
で:
using days = std::chrono::duration<int, std::ratio<86400>>;
次に、それに時間、分、秒を追加できます。分数秒を処理するには、少し踊る必要があります。
double s;
your_stream >> s; // 32.121
using namespace std::chrono;
duration<double> dsecs(s);
seconds sec = duration_cast<seconds>(dsecs);
milliseconds ms = duration_cast<milliseconds>(dsecs - sec);
t += sec + ms;
milliseconds ms = round<milliseconds>(dsecs - sec);
duration_cast
ゼロに向かって切り捨てられます。このリンクには、他の丸めモードがあります:床、円形、天井。
簡単に再利用できるように、すべてをきちんとした機能でまとめます。:-)
上記のコードはすべてUTCを想定しています。解析している日付/時刻がUTCからオフセットされていることがわかっている場合は、そのオフセットを加算/減算できます。system_clock
追跡Unix時間のすべての既知の実装。これは、UTCタイムゾーンでの1970-01-01からの秒数です。
更新
この回答を書いて以来、私はOPが当時求めていたと思われるより一般的なライブラリを開発しました。さまざまなサブセカンド精度を直接次のstd::chrono::system_clock::time_point
ように解析できます。
#include "date/date.h"
#include <iostream>
#include <sstream>
int
main()
{
std::istringstream in{"30/03/09 16:31:32.121\n"
"30/03/09 16:31:32.1214"};
std::chrono::system_clock::time_point tp;
in >> date::parse("%d/%m/%y %T", tp);
using namespace date;
std::cout << tp << '\n';
in >> date::parse(" %d/%m/%y %T", tp);
std::cout << tp << '\n';
}
この出力:
2009-03-30 16:31:32.121000
2009-03-30 16:31:32.121400
このライブラリは、最初に説明したものと同じ手法とツールを使用しますが、パッケージ化されており、単一のヘッダーライブラリとしてすぐに使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加