2017-06-06 163 views
2

我正在使用strptime解析具有特定格式的日期和时间。该格式使用Python格式化指令,这些指令与C指令完全相同,只是在Python中有一个额外的%f指令,其毫秒数定义为Microsecond as a decimal number, zero-padded on the left.。因此,例如:C++解析日期/时间(以微秒为单位)

std::tm tmb; 
strptime("2010-12-30T01:20:30.0Z", "%Y-%m-%dT%H:%M:%S.%fZ", &tmb); 

这会导致因为%f的解析错误。我不能直接删除,因为像%m%d这样的指令可以采用一位或两位数字。

此外,这是一个问题,因为%f指令可能需要1到6位数字。有没有办法解决这个问题?

我在C++中工作,如果有任何可以帮助的内置函数。

+0

你想保留亚秒数据还是干脆忽略它? https://stackoverflow.com/a/25155338/1364178表示你不能在tm中存储亚秒数据。如果你试图忽略它,你不能根据秒后的时间段来分割字符串吗? –

回答

0

使用Howard Hinnant's free, open-source, C++11, header-only datetime library,你可以很容易地解析你想要的任何精度。你不能把它放到tm之内,因为它被限制在秒精度。

例如:

#include "date.h" 
#include <cassert> 
#include <sstream> 

int 
main() 
{ 
    std::chrono::system_clock::time_point tp; 
    std::istringstream ss{"2010-12-30T01:20:30.123456Z"}; 
    ss >> date::parse("%FT%TZ", tp); 
    assert(!ss.fail()); 
    using namespace date; 
    using namespace std::chrono_literals; 
    assert(tp == sys_days(2010_y/dec/30) + 1h + 20min + 30s + 123456us); 
} 

这使用C++ 14个计时文字。如果您在C++ 11的时候,最后两行是这样:

using namespace std::chrono; 
    assert(tp == sys_days(2010_y/dec/30) + hours{1} + minutes{20} + 
              seconds{30} + microseconds{123456}); 

如果你坚持前<chrono> C++(C++ 98/C++ 03),该库赢得帮不了你。

解析的精确度由输入到parse函数中的time_point的精度来控制,而不是通过格式标记来控制。解析将尝试解析为的小数位数为你time_point将举行,但会优雅地放弃,如果它变得更少位数:

sys_time<nanoseconds> tp; // type-alias for a system_clock::time_point 
          // with nanoseconds precision 
ss >> date::parse("%FT%TZ", tp); // still ok 

如果有更多的数字比需要,解析会失败,但仅仅是因为它不会看到拖尾(必填)Z

sys_time<milliseconds> tp; 
ss >> date::parse("%FT%TZ", tp); 
assert(ss.fail()); // found "4" instead of "Z" 

如果Z一直没格式的一部分,它会分析"2010-12-30T01:20:30.123"到毫秒,precsion time_point

此库提供了完整的解析和格式化工具,建立在std <chrono> library之上,因此您永远不必处理古代tm结构。但是,如果需要,您可以can convert to/from tm(以秒精度)与其他代码进行通信。

"%F""%Y-%m-%d"的快捷方式。你也可以使用。

"%T""%H:%M:%S"的快捷方式。你也可以使用。

+1

谢谢! –