"HH:MM:SS.<秒の端数>" 形式の文字列を (timedelta) 数値型に、またはその逆に C または C++ に変換するための一般的で便利なクロスプラットフォームの方法はありますか?
2 に答える
それほど難しいことではありません(あなたの時間は手書きではなく機械で生成されたものであると想定しているため、「正しい」と信頼できます-そうでない場合は、「この値は範囲内ですか」という負荷を追加する必要がありますチェック)。また、分数は常に同じ桁数であると仮定します。
int64_t parsetime(char *str)
{
int hh, mm, ss, fract;
int64_t t;
if (sscanf(str, "%d:%d:%d.%d", &hh, &mm, &ss, &fract) != 4)
{
printf("Badly formed time %s\n", str);
return -1;
}
// 1000000 assumes there are 6 digits in fract, and we want microseconds.
t = ((hh * 60) + mm *60) + s) * 1000000 + fract;
return t;
}
double
フォーマット文字列にandを使用して同様のことを行い%d:%d:%lf
、関連する乗数を掛けて分数を整数形式にすることができます (たとえば、ミリ秒の場合は 1000、マイクロの場合は 1000000、ナノ秒の場合は 100000000 など)。
strptime
この特定の問題に対応するのと同じくらい移植性があります。これは C 標準ライブラリにはありません (C89、C99、および C2011 は POSIX よりも移植性が高くないため追加されていたとしても (Microsoft に感謝します))、十分に普及しているため、コードを次のように記述することをお勧めします。それは普遍的であり、ビルドシステムに存在しないことを検出し、代替を挿入します。ここで BSD ライセンスの代替品を入手できます: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD (移植性の調整が必要な場合があります)