我想将格式为“20160907-05:00:54.123”的字符串转换为毫秒。 我知道 strptime 在Windows中不可用,我想在Windows和Linux中运行我的程序。我也不能使用第三方库。 我可以将字符串标记化并转换它。但是有一种更优雅的方式就像使用strptime这样做吗?
答案 0 :(得分:5)
std::sscanf
怎么样?
#include <iostream>
#include <cstring>
int main() {
const char *str_time = "20160907-05:00:54.123";
unsigned int year, month, day, hour, minute, second, miliseconds;
if (std::sscanf(str_time, "%4u%2u%2u-%2u:%2u:%2u.%3u", &year, &month,
&day, &hour, &minute, &second,&miliseconds) != 7)
{
std::cout << "Parse failed" << std::endl;
}
else
{
std::cout << year << month << day << "-" << hour << ":"
<< minute << ":" << second << "." << miliseconds
<< std::endl;
}
}
输出(ideone): 201697-5:0:54.123
但是,您应确保输入有效(例如,日期可以在[0,99]范围内。)
答案 1 :(得分:4)
没有第三方库太糟糕了,因为here is one(MIT许可证)只是一个标题,在linux和Windows上运行,并且无缝地处理毫秒:
#include "date.h"
#include <iostream>
#include <sstream>
int
main()
{
date::sys_time<std::chrono::milliseconds> tp;
std::istringstream in{"20160907-05:00:54.123"};
date::parse(in, "%Y%m%d-%T", tp);
std::cout << tp.time_since_epoch().count() << '\n';
}
输出:
1473224454123
为您完成了错误检查。如果日期无效,则流fail()
。
date::sys_time<std::chrono::milliseconds>
是std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
的类型别名。即它来自system_clock::time_point
的家庭,只有milliseconds
精度。
完整记录:
https://howardhinnant.github.io/date/date.html
没有比这更优雅。
答案 2 :(得分:2)
考虑到字符串的格式,可以很容易地解析它(如果正则表达式或get_time
可能更优雅):
tm t;
t.tm_year = stoi(s.substr(0, 4));
t.tm_mon = stoi(s.substr(4, 2));
t.tm_mday = stoi(s.substr(6, 2));
t.tm_hour = stoi(s.substr(9, 2));
t.tm_min = stoi(s.substr(12, 2));
t.tm_sec = 0;
double sec = stod(s.substr(15));
使用mktime
找到自纪元以来的时间:
mktime(&t) + sec * 1000
请注意,小数秒需要以不同的方式处理 - 不幸的是,tm
has only integer seconds。
(请参阅完整代码here。)
修改强>
正如Mine和Panagiotis Kanavos在评论中正确指出的那样,Visual C ++显然支持get_time
很长一段时间,而且它的使用时间要短得多(请注意,小数秒需要同样处理但是,方式。