我想将格式为"20160907-05:00:54.123"的字符串转换成毫秒。 我知道在Windows中没有可用的strptime函数,并且我希望能够在Windows和Linux上运行我的程序。我也不能使用第三方库。 我可以对字符串进行标记化并转换。但是是否有更优雅的方法,例如使用strptime函数来完成这个任务?
我想将格式为"20160907-05:00:54.123"的字符串转换成毫秒。 我知道在Windows中没有可用的strptime函数,并且我希望能够在Windows和Linux上运行我的程序。我也不能使用第三方库。 我可以对字符串进行标记化并转换。但是是否有更优雅的方法,例如使用strptime函数来完成这个任务?
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]范围内)。
很遗憾不能使用第三方库,因为这里有一个(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
这再也没有比这更优雅的了。
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
只有整数秒。编辑
正如Mine和Panagiotis Kanavos在评论中正确指出的那样,Visual C++显然已经支持get_time
相当长时间了,并且使用它更为简短(请注意,小数秒需要以相同的方式处理)。
std::get_time(&when, "%Y%m%d-%H:%M:%S");
看起来更简洁。 - Mine