- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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/
我在尝试使用 put_time 和 get_time 函数时遇到了一些问题。 我拿了这段代码: #include #include #include #include int main() {
我正在解决网站上的问题。我的代码如下: string timeConversion(string s) { std::tm t = {}; string result = "";
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
如果我尝试使用 std::get_time 在 tm 中设置日期什么也没有发生,但是输入流处于失败状态,这意味着解析错误已经发生了。 下面的代码有什么问题? { // setting time w
我正在使用以下代码将字符串流解析为 tm 结构: std::tm tm; std::stringstream ss("Jan 9 2014 12:35:34"); ss >> std::get_tim
我正在尝试解析日期时间字符串并将结果放入 std::tm 结构中。下面是代码, #include #include #include #include std::stringstream ss
我在这个例子中花了很多时间,每次我得到错误 Unable to read cin with an ios_base::iostate equal to failbit 来自这段代码: #include
我有这个简单的功能: char* get_time() { char *buffer = malloc(sizeof(char)*10); /* HOW TO FREE IT ? */
使用 std::get_time 解析字符串是否需要分隔符?我找不到一个引用来说明它是。我正在尝试解析 ISO 日期/时间字符串,例如“20140105T123456”——例如: 例如, #inclu
我想弄清楚为什么我不能在 C++11 中将 std::get_time() 与 %F 格式说明符一起使用。它在 clang 3.8.0 或 gcc 5.4.0 中对我不起作用。我的印象是 strfti
我的类中有以下 C++ 代码,用于将 ISO 8601 字符串转换为 time_t 结构: #include #include #include #include #include ....
我正在尝试这样做但失败了: std::istringstream ss("1212"); ss >> std::get_time(&t, "%y%m"); if (ss.fail()) // ever
我正在使用 Visual Studio 2015 在 Windows 上执行以下代码。基本上我使用 std::get_time 来解析日期,但是当日期无效时,例如,一天大于31,它似乎没有在流上设置失
我正在尝试在 visual studio 2012 中使用 std::get_time 解析日期和时间字符串。时间字符串似乎可以正确解析,但不能正确解析日期字符串。我想最终将日期字符串转换为整数以进行
在 locale("en_US") 中,我无法通过 std::time_get::get_time() 读取时间。我尝试了以下格式,但它不起作用。当我将区域设置更改为 locale("en_GB")
我正在尝试按时间顺序对照片进行排序。因此,我从 EXIF 数据中将时间提取为字符串,然后将其转换为 std::time_t。但是我有时会得到不正确的结果。我已将问题简化为这个最小的例子。它具有三个时间
我今天正在处理一些时间函数,并注意到使用 %r(或 %p)的标准转换似乎不适用于通过 的输入g++ 或 clang++ 上的 std::get_time()。见 this live code vers
我正在尝试解析格式为 YYMMDD 的日期。作为测试,我尝试了以下代码: #include #include #include #include int main(){ std::tm
我想将 ANSI C 格式的字符串转换为 std::tm 对象。 例子 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format 更多信息在这里 here
我正在尝试创建简单的 jni,但应用程序崩溃了。我无法找到我所犯的错误。这是我的代码: 示例.c #include double My_variable = 3.0; int fact(int
我是一名优秀的程序员,十分优秀!