- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想用 std::get_time()
解析日期字符串,但代码似乎适用于 VC++ 2015,但不适用于 gcc 6.3 和 clang 4.0。这是 MCVE:
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
int main() {
std::string line = "February 4 1993 15:21";
std::tm date_1 = {};
std::stringstream ss(line);
ss >> std::get_time(&date_1, "%b %d %Y %H:%M");
if(ss.fail())
{
std::cout << "parse failed\n";
}
std::cout << date_1.tm_year << "\n";
std::cout << date_1.tm_mon << "\n";
std::cout << date_1.tm_mday << "\n";
std::cout << date_1.tm_hour << "\n";
std::cout << date_1.tm_min << "\n";
return 0;
}
这是 VC++ 2015 的结果:
93
1
4
15
21
以下是 gcc 6.3.2 和 clang 4.0 的结果(我在 ideone.com 和 Coliru 上使用了编译器)——有和没有 c++14 标志:
parse failed
0
1
0
0
0
当我使用缩写的月份名称(例如 Feb、Aug 等)时,它确实有效。
我已经尝试在 stringstream
(en_US
、en_GB
+ UTF-8 版本)上设置不同的语言环境,但它们要么没有任何区别,要么导致运行时错误。我试过更改分隔符,但也没有什么区别。
我读过CPP Reference std::get_time()
中的 %b:
parses the month name, either full or abbreviated, e.g. Oct
这是 gcc 和 clang 中的错误/缺失功能,还是编译器,与上面写的相反,根据实现仅自由处理缩写名称?标准对此有何规定?两个编译器在这里表现出相同的行为是巧合吗?
最佳答案
如评论中所述,这是一个 libstdc++ 错误。然而,没有注意到如何解决它。
使用 %B
而不是 %b
,而 libstdc++ 将进行解析。用于解析,%B
和 %b
应该有相同的行为。但是对于格式化,%B
%b
时输出语言环境的完整月份名称格式化缩写的月份名称。
最后,你可能对Howard Hinnant's free, open-source date-time library感兴趣这允许您直接解析为 <chrono>
时间点和持续时间:
#include "date.h"
#include <iostream>
#include <sstream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::istringstream in{"February 4 1993 15:21"};
sys_time<minutes> tp;
in >> parse("%B %d %Y %H:%M", tp);
if (in.fail())
return 1;
std::cout << tp << '\n';
}
输出:
1993-02-04 15:21
在上面的例子中sys_time<minutes>
是 std::chrono::time_point<std::chrono::system_clock, std::chrono::minutes>
的类型别名.
关于c++ - gcc 6.3 和 clang 4.0 中的 std::get_time() 不适用于完整的月份名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367577/
我在尝试使用 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
我是一名优秀的程序员,十分优秀!