5

Cのstrptime()関数は、無効な日付の検出に失敗します。例:2011-02-31、2011-04-31。この問題に対する他の機能または回避策はありますか

4

1 に答える 1

6

を使用mktimeした後、を使用して構造を正規化できますstrptime

struct tm ltm = {0};
char buf[] = "2011-02-31";
puts(buf);
strptime(buf, "%Y-%m-%d", &ltm);
mktime(&ltm);
strftime(buf, sizeof(buf), "%Y-%m-%d", &ltm);
puts(buf);

上記の例では、以下の出力が生成されます。

2011-02-31
2011-03-03

前後の文字列mktimeが一致しない場合は、入力文字列が有効な日付ではなかったことがわかります。

どのフィールドが無効であったかを知る必要がある場合は、をltm呼び出す前に構造のコピーを保存できますmktime。次に、日(tm_mday)、月(tm_mon)、または年(tm_year)が無効な形式のものであったかどうかを調べることができます。の場合tm_mon0は1月、11は12月です。の場合tm_yearは、からの年数1900です。2月の日を検証するときは、うるう年を考慮することを忘れないでください。

于 2012-07-11T07:59:48.870 に答える