4

strptimePOSIXは、日付と時刻の解析に使用できる便利な関数、を定義します。strptimeしたがって、理論的には、「YYYY-MM-DD」という形式の日付がある場合、次のように解析するために使用できるはずです。

char myDate[] = "2012-01-01";

struct tm result;
char *end = strptime(myDate, "%Y-%m-%d", &result);

…そして、次のように正規表現で元に戻します。

if (end != NULL)
{
    char outDate[11];
    strftime(outDate, sizeof(outDate), "%Y-%m-%d", &result);
    printf("%s\n", outDate);
}
else
    printf("Invalid date\n");

OS XおよびLinuxでは、これは2012-01-01を出力します。ここまでは順調ですね!ただし、入力日が間違った形式であるとしましょう:2012年1月1日。

上記のコードを再度実行すると、OS Xで、予期される「無効な日付」が表示されます。ただし、Linuxでは、1-01-20 — 1月20日1日(はい、1年目)になります。

OS Xは指定子に厳密に従い、4桁の年が存在する場合に%Y のみ文字列を解析します。ただし、Linuxにはいくつかの自由があり、2桁を1年として解釈します。つまり、2001年であると想定しているようには見えず、1年目として扱います。

これは、私のifステートメントを次のようなものに変更することで回避できます

if (end != NULL && *end == '\0')

…しかし、それはおかしなようです。strptimeLinuxでより厳密に動作さ%Yせ、入力文字列に4桁の年がない場合に失敗する可能性があるかどうかを誰かが知っていますか?

4

2 に答える 2

2

strptime()の動作を変更したり、フォーマット文字列内で長さを指定したりするオプションはありません。(glibc-2.3のソースを調べたところ、strptimeはフォーマット修飾子とフィールド幅を破棄するため、「%04Y」のようなものは変更されません)。

しかし、コメントですでに指摘されているように、に問題はありませんif (end != NULL && *end == '\0')。それだけを使うことをお勧めします。

于 2012-12-02T17:41:44.453 に答える
0

最初のダッシュのインデックスを見つけて、その値に応じていずれかのマスクを使用するのが最善の策だと思います。

于 2012-11-05T20:16:28.627 に答える