使用std :: chrono将32位unix时间戳转换为std :: string

时间:2017-01-17 22:46:22

标签: c++ c c++11 time chrono

我正在尝试使用std::chrono来制作std::string但遇到问题。

这是我想模仿的C(-ish)代码:

std::uint32_t time_date_stamp = 1484693089;
char date[100];
struct tm *t = gmtime(reinterpret_cast<const time_t*>(&time_date_stamp));
strftime(date, sizeof(date), "%Y-%m-%d %I:%M:%S %p", t);

我的起点始终是std::uint32_t,它来自我无法控制的数据格式。

抱歉,我没有任何C ++作为起点,我甚至不知道如何正确地制作std::chrono::time_point

2 个答案:

答案 0 :(得分:4)

这是一种简单的方法,可以使用此便携式C++11/14 free, open-source, header-only library而不降低到C tm

#include "date.h"
#include <iostream>
#include <string>

int
main()
{
    std::uint32_t time_date_stamp = 1484693089;
    date::sys_seconds tp{std::chrono::seconds{time_date_stamp}};
    std::string s = date::format("%Y-%m-%d %I:%M:%S %p", tp);
    std::cout << s << '\n';
}

输出:

2017-01-17 10:44:49 PM

这没有与古代gmtime C函数相关的线程安全问题。

上面的{p> date::sys_secondstypedef的{​​{1}}。

答案 1 :(得分:3)

<chrono>不是用于将日期时间格式化为字符串的库。它可用于转换不同的时间表示(毫秒到天等),将时间戳添加到一起等等。

标准库中唯一的日期时间格式化函数是从C标准库继承的函数,包括您已经在&#34; C(-ish)&#34;中使用的std::strftime。版。编辑:正如jaggedSpire所指出的,C ++ 11引入了std::put_time。它提供了一种使用与C函数使用的API相同的API来传输格式化日期的便捷方法。

由于std::gmtime(以及std::localtime如果您要使用它)将他们的参数作为unix时间戳,您不需要<chrono>来转换时间。它已经在正确的表示中。只有基础类型必须从std::uint32_t转换为std::time_t。这不是在您的C版本中实现的。

使用std::put_time格式转换时间戳的便携方式:

std::uint32_t time_date_stamp = 1484693089;
std::time_t temp = time_date_stamp;
std::tm* t = std::gmtime(&temp);
std::stringstream ss; // or if you're going to print, just input directly into the output stream
ss << std::put_time(t, "%Y-%m-%d %I:%M:%S %p");
std::string output = ss.str();