将日期时间转换为毫秒 - C ++ - 跨平台

时间:2016-09-07 13:40:46

标签: c++ posix

我想将格式为“20160907-05:00:54.123”的字符串转换为毫秒。 我知道 strptime 在Windows中不可用,我想在Windows和Linux中运行我的程序。我也不能使用第三方库。 我可以将字符串标记化并转换它。但是有一种更优雅的方式就像使用strptime这样做吗?

3 个答案:

答案 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很长一段时间,而且它的使用时间要短得多(请注意,小数秒需要同样处理但是,方式。