使用std::get_time解析字符串是否需要分隔符?我找不到任何证据可以说是的。我试图解析一个ISO日期/时间字符串,例如"20140105T123456“-例如:
例如,
#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
#include <ctime>
int main(int argc, char* argv[])
{
std::tm t = { 0 };
// fails
std::istringstream ss("20141105T123456");
ss >> std::get_time(&t, "%Y%m%dT%H%M%S");
// works
//std::istringstream ss("2014 11 05 T 12 34 56");
//ss >> std::get_time(&t, "%Y %m %d T %H %M %S");
std::ostringstream os;
std::cout << std::put_time(&t, "%c") << std::endl;
}我正在使用2013。我试着在Linux上构建,但是我拥有的GCC的最新版本是4.7.3,它似乎还不支持get_time。
我犯了个愚蠢的错误还是需要分离器?
发布于 2014-01-17 02:44:00
根据第二参数的描述 std::get_time的说法,分离器是不需要的。
格式字符串由零或多个转换说明符、空白字符和普通字符(%除外)组成。在不区分大小写的比较中,每个普通字符都需要匹配输入流中的一个字符。每个空格字符匹配输入字符串中的任意空格。每个转换规范从%字符开始,可选地后面跟着E或O修饰符(如果区域设置不支持,则忽略E或O修饰符),然后是决定说明符行为的字符。格式说明符匹配POSIX函数strptime()
在我的Mac上,我使用clang++(AppleLLVM5.0 (clang-500.2.79) (基于LLVM 3.3svn) )编译代码,并运行程序,输出是:Sun Nov 5 12:34:56 2014。实际上,我已经安装了gcc 4.8.2,但它不支持std::get_time和std::put_time。然后搜索该函数的实现状态,并找到这一点在GCC 4.8.0中没有实现。。
它在VS2013中失败了,在调用std::get_time之后,t中的所有元素都是0。格式说明符在Windows上不执行预期的操作。这不是你的错。
发布于 2016-07-14 20:49:18
标准中对POSIX strptime()函数的引用造成了一些混乱。POSIX标准指定转换操作符由非alpha字符分隔.
应用程序应确保在任何两个转换规范之间存在空白或其他非字母数字字符。
GLIBC版本的strptime (和,海事组织,任何正常的执行)不需要这些分离器。[http://man7.org/linux/man-pages/man3/strptime.3.html -见注释部分。]
要求分隔符使得无法解析符合ISO-8601日期/时间基本格式。由于C++也是一个ISO标准,它的strptime()函数应该能够解析这种格式。
我认为需要澄清std::get_time()文档,以明确说明不需要分隔符,并通过指向ISO-8601证明该声明的合理性。应该进一步澄清的是,POSIX strptime()标准只指定符合实现所需支持的转换说明符。
https://stackoverflow.com/questions/21172767
复制相似问题