使用std :: get_time解析日期/时间字符串需要分隔符吗?

spe*_*ell 7 c++ datetime

是使用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;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual Studio 2013.我尝试在Linux上构建,但我最新版本的GCC是4.7.3,它似乎还不支持get_time.

我的愚蠢错误或需要分隔符?

jfl*_*fly 6

根据第二参数的描述, std::get_time不需要分隔符.

格式字符串由零个或多个转换说明符,空格字符和普通字符(%除外)组成.在不区分大小写的比较中,期望每个普通字符匹配输入流中的一个字符.每个空白字符都匹配输入字符串中的任意空格.每个转换规范都以%字符开头,可选地后跟E或O修饰符(如果不受语言环境支持则忽略),后跟确定说明符行为的字符.格式说明符与POSIX函数strptime()匹配

在我的Mac上,我使用clang ++(Apple LLVM版本5.0(clang-500.2.79)(基于LLVM 3.3svn))来编译代码,并运行程序,输出为:Sun Nov 5 12:34:56 2014.实际上,我已经安装了gcc 4.8.2,但它不支持std::get_timestd::put_time.然后我搜索此函数的实现状态,并发现在GCC 4.8.0中没有实现

它确实在VS2013中失败,在调用之后std::get_time,t中的所有元素都只是0.格式说明符不能在Windows上执行预期的操作.这不是你的错.