Visual Studio 2015でWindowsで次のコードを実行しています。基本的には、std::get_time
を使用して日付を解析しますが、日付が無効な場合31日を超えると、ストリームにフェイルビットを設定していないように見えます。Visual 2015のstd :: get_timeが不正な日付で失敗しない
私はこれをg ++ 5.4.0でUbuntuで試してみましたが、失敗ビットを設定して「解析が失敗しました!」と表示されます。これはWindows上のバグですか、何か間違っていますか?
ありがとうございます!
std::string date = "2019-2-37 23:00:00"; // day (37) is wrong.
std::string format = "%Y-%m-%d %H:%M:%S";
std::tm tm_object{};
std::istringstream input(date);
input.imbue(std::locale(std::setlocale(LC_ALL, nullptr)));
input >> std::get_time(&tm_object, format.c_str());
if (input.fail())
{
std::cout << "Parsing failed!";
}
else
{
std::cout << "Parsing ok!\n";
std::cout << "Day is : " << tm_object.tm_mday;
}
あなたの答えをありがとうHoward、あなたの図書館は私のために働く! とにかく、なぜWindows用のstrptime関数がないのか、なぜstd :: get_timeがVisual 2015で日付が正しいのかわからない理由がわかりません。 – rboc
@rboc:うれしいことです! 'strptime'は標準のC++ではなく、POSIXで指定されています。 'std :: get_time'は' strptime'で指定します。 POSIXでは、 'strptime'について「エラーは定義されていません。 (http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html) –
はい、しかし、少なくともstrptimeは失敗した完了(2月37日)でnullポインタを返します。私はstd :: get_timeをVisual Studio 2015で同様のことをすることを期待しました。 – rboc