有人知道一种快速,便携的方法来解析包含小数秒的日期/时间字符串吗?
例如:
2017-10-23T07:23:08.78
到目前为止,我可以用以下方法解析其他所有内容:
std::tm tm = {};
std::stringstream datestr("2017-10-23T07:23:08.78");
datestr >> std::get_time(&tm, "%Y-%m-dT%H:%M:%S.??");
上述代码段已从this帖子修改。
This其他帖子显示了解析年度两次的聪明伎俩。不幸的是,由于小数秒是我表示中的最后一个字段,它将覆盖我实际想要使用的任何有效字段。
参考文档(here)没有列出小数秒的任何转换说明符,也没有列出任何可用于匹配和丢弃任意数字的说明符(与%t
或{{1相同)对于空白。
要清楚,我完全可以放弃这部分精度。我宁愿不使用原始字符串函数来操作它,但这似乎是我能找到的唯一选择。
最后,此字符串来自远程服务器,因此格式不受我的控制。我的环境目前是Posix,虽然我希望尽可能多的便携性。
修改:此问题已被标记为this的副本。我不相信这是因为我的问题是关于解析/丢弃没有字符说明符的令牌。这在其他帖子中是独一无二的,例如,使用%n
来解析时区(我也不感兴趣)。我的问题专门针对解析,而不是对结果值的解释。
答案 0 :(得分:2)
根据上面inxoy的精彩评论,以下是Howard Hinnant's, free, open-source, portable, datetime library的方法:
#include "date/date.h"
#include <iostream>
#include <sstream>
int
main()
{
std::stringstream datestr("2017-10-23T07:23:08.78");
date::sys_time<std::chrono::milliseconds> tp;
datestr >> date::parse("%FT%T", tp);
if (datestr.fail())
return 1;
std::cout << date::format("%F %T\n", tp);
}
date::sys_time<std::chrono::milliseconds>
是std::chrono::system_clock::time_point
的类型别名,除了milliseconds
精度(您可以使用任何所需的精度)。
"%F"
是"%Y-%m-%d"
的捷径,您可以互换使用。
如果您想要std::tm
,wiki page shows how to do this以及大量其他示例代码。
上述程序可以输出:
2017-10-23 07:23:08.780
我可以改为使用:
std::chrono::system_clock::time_point tp;
这会将我的输出更改为:
2017-10-23 07:23:08.780000
%T
格式化程序将输出time_point
具有的精度,%T
解析器将解析与time_point
一样多的十进制数字。
"date/date.h"
没有时区。它是严格的UTC(技术上Unix Time)。如果您需要使用时区(或闰秒),则可以在"date/date.h"
之上构建一个额外的free, open-source IANA time zone library。