Moh*_*ena 6 c++ datetime parsing posix
我strptime用来解析具体格式的日期和时间.该格式使用Python格式化指令,它与C指令完全相同,只是%f在Python中有一个额外的指令,定义为毫秒Microsecond as a decimal number, zero-padded on the left..例如:
std::tm tmb;
strptime("2010-12-30T01:20:30.0Z", "%Y-%m-%dT%H:%M:%S.%fZ", &tmb);
Run Code Online (Sandbox Code Playgroud)
这会导致解析错误,因为%f.我不能直接删除因为指令喜欢%m和%d可以采取一个或两个数字.
此外,这是一个问题,因为该%f指令可能需要1到6位数.有办法解决这个问题吗?
我正在使用C++,如果有任何内置函数可以提供帮助.
使用Howard Hinnant的免费,开放源代码,C ++ 11,仅标头的日期时间库,您可以轻松解析所需的任何精度。您只能将其放入,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);
}
Run Code Online (Sandbox Code Playgroud)
这使用C ++ 14 chrono文字。如果您使用的是C ++ 11,则最后两行如下所示:
using namespace std::chrono;
assert(tp == sys_days(2010_y/dec/30) + hours{1} + minutes{20} +
seconds{30} + microseconds{123456});
Run Code Online (Sandbox Code Playgroud)
如果您对<chrono>C ++之前的版本(C ++ 98 / C ++ 03)感到困惑,则此库将无济于事。
解析的精度由time_point您输入到parse函数中的精度控制,而不是由格式标志控制。解析将尝试解析您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
Run Code Online (Sandbox Code Playgroud)
如果位数超过所需的位数,解析将失败,但这仅是因为它看不到结尾(必填)Z:
sys_time<milliseconds> tp;
ss >> date::parse("%FT%TZ", tp);
assert(ss.fail()); // found "4" instead of "Z"
Run Code Online (Sandbox Code Playgroud)
如果Z不是格式的一部分,它将被解析"2010-12-30T01:20:30.123"为milliseconds-precsion time_point。
该库具有完整的解析和格式化功能,它们建立在std <chrono>库的顶部,因此您不必处理古老的tm结构。但是,如果需要,您可以tm与其他代码进行来回转换(精确到秒)。
"%F"是的快捷方式"%Y-%m-%d"。您可以使用。
"%T"是的快捷方式"%H:%M:%S"。您可以使用。
| 归档时间: |
|
| 查看次数: |
2229 次 |
| 最近记录: |