gpt4 book ai didi

c++ - Visual 2015 上的 std::get_time 不会在不正确的日期失败

转载 作者:太空狗 更新时间:2023-10-29 20:35:20 24 4
gpt4 key购买 nike

我正在使用 Visual Studio 2015 在 Windows 上执行以下代码。基本上我使用 std::get_time 来解析日期,但是当日期无效时,例如,一天大于31,它似乎没有在流上设置失败位。

我已经在使用 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 Hinnant's free, open-source header-only datetime library在 Windows 上为您提供所需的行为。语法仅略有不同,使用起来更容易,并且与 <chrono> 兼容。 .它也比 C++ 标准的时间解析部分更好地记录和指定。

#include "date.h"
#include <iostream>
#include <sstream>
#include <string>

int
main()
{
std::string date = "2019-2-37 23:00:00"; // day (37) is wrong.
std::string format = "%Y-%m-%d %H:%M:%S";
date::sys_seconds tm_object{};
std::istringstream input(date);
input >> date::parse(format, tm_object);
if (input.fail())
{
std::cout << "Parsing failed!";
}
else
{
std::cout << "Parsing ok!\n";
date::year_month_day ymd = date::floor<date::days>(tm_object);
std::cout << "Day is : " << ymd.day();
}
}

输出:

Parsing failed!

这个库也适用于 g++ 5.4.0 和 clang。

您还可以简化您的 format下降到 "%F %T" , 如果需要,它还可以以亚秒精度工作。

关于c++ - Visual 2015 上的 std::get_time 不会在不正确的日期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com