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

时间:2014-01-16 21:00:16

标签: 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;
}

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

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

2 个答案:

答案 0 :(得分:6)

根据the description of second parameter of 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。然后我搜索此函数的实现状态,并找到that is not implemented in GCC 4.8.0

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

答案 1 :(得分:0)

标准中对POSIX strptime()函数的引用引起了一些混淆。 POSIX标准指定转换运算符由非字母字符分隔。

  

应用程序应确保在任何两个转换规范之间存在空格或其他非字母数字字符。

strptime的GLIBC版本(以及IMO,任何理智的实现)都不需要这些分隔符。 [substring(string from pattern) - 请参阅“备注”部分。]

要求分隔符使得无法解析符合ISO-8601日期/时间的基本格式。由于C ++也是ISO标准,因此其strptime()函数应该能够解析这种格式。

我认为需要澄清std :: get_time()文档以明确声明不需要分隔符并通过指向ISO-8601来证明该语句的合理性。应进一步澄清的是,POSIX strptime()标准仅指定了符合实现所需的转换说明符。