strptime
POSIXは、日付と時刻の解析に使用できる便利な関数、を定義します。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')
…しかし、それはおかしなようです。strptime
Linuxでより厳密に動作さ%Y
せ、入力文字列に4桁の年がない場合に失敗する可能性があるかどうかを誰かが知っていますか?