我正在尝试使用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
。
答案 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函数相关的线程安全问题。
date::sys_seconds
是typedef
的{{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();