C ++:如何将unix时间的字符串转换为* tm? (使用strptime时出错:“无法将'String'转换为'tm *'“)

时间:2018-10-19 18:55:35

标签: c++ datetime time unix-timestamp

我正在使用API​​来检索UNIX时间,但是它以字符串形式出现,即“ 1539944398000”

我希望将此时间转换为UNIX时间,以便可以对其进行操作(并最终仅提取小时/分钟以进行打印)。

这是我尝试过的代码:

String nextBusScheduled = client2.readStringUntil('<');
char bufScheduled[40];
strptime(bufScheduled, "%Y-%m-%d", nextBusScheduled);

这是我得到的错误:

cannot convert 'String' to 'tm*' for argument '3' to 'char* strptime(const char*, const char*, tm*)' 

1 个答案:

答案 0 :(得分:-1)

我推荐Howard Hinnant's date/time library。对于本练习,您需要的只是date.h标头(并且没有源):

#include "date/date.h"
#include <chrono>
#include <cstdint>
#include <iostream>
#include <sstream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    int64_t i;
    istringstream in{"1539944398000"};
    in >> i;
    sys_time<milliseconds> tp{milliseconds{i}};
    cout << tp << '\n';
    cout << format("%H:%M", tp) << '\n';
}

只需解析为64位整数类型,然后根据该解析构造一个std::chrono::milliseconds(到目前为止,这只是C ++ 11)。然后,您可以从中构造一个sys_time<milliseconds>sys_time<milliseconds>只是std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>的类型别名,或更简单地说:毫秒精度的Unix Time

我展示了两种打印方法,date.h确实可以为您提供帮助。此示例输出:

2018-10-19 10:19:58.000
10:19

只需删除#include "date/date.h"using namespace date;,此代码即可移植到C ++ 20。