我希望能够将具有毫秒分辨率的本地时间和日期放入字符串中,如下所示:
YYYY-MM-DD hh:mm:ss.sss
看起来似乎很简单,但我还没有找到一个简单的答案来解决这个问题。我用C ++编写并且可以访问11编译器,但是如果它更干净的话,可以使用C解决方案。我在这里发现了一个解决方案Get both date and time in milliseconds的帖子,但是使用标准库肯定不会那么困难。我可能会继续推进这种类型的解决方案,但希望通过在SO上提出问题来增加知识库。
我知道这会有效,但似乎又不必要了:
#include <sys/time.h>
#include <stdio.h>
int main(void)
{
string sTimestamp;
char acTimestamp[256];
struct timeval tv;
struct tm *tm;
gettimeofday(&tv, NULL);
tm = localtime(&tv.tv_sec);
sprintf(acTimestamp, "%04d-%02d-%02d %02d:%02d:%02d.%03d\n",
tm->tm_year + 1900,
tm->tm_mon + 1,
tm->tm_mday,
tm->tm_hour,
tm->tm_min,
tm->tm_sec,
(int) (tv.tv_usec / 1000)
);
sTimestamp = acTimestamp;
cout << sTimestamp << endl;
return 0;
}
尝试用旧C语言查看C ++和strftime的put_time。两者都只允许我达到我能说的最佳分辨率。你可以看到我到目前为止所获得的两种方法。我想将它放入一个字符串
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
std::cout << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << std::endl;
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer,sizeof(buffer),"%Y-%m-%d %I:%M:%S",timeinfo);
std::string str(buffer);
std::cout << str;
我唯一可以理解的是使用gettimeofday并除去最后一秒之外的所有数据并将其附加到时间戳,仍然希望有更清洁的方法。
任何人都能找到更好的解决方案吗?
答案 0 :(得分:6)
我建议看看Howard Hinnant的date library。其中一个examples given in the wiki显示了如何获得当前本地时间,达到std::chrono::system_clock
实现的给定精度(Linux上的纳秒,内存中的纳秒数):
date::floor()
来获得所需的精度。因此,要生成问题中请求的字符串,您可以执行以下操作:
#include "tz.h"
#include <iostream>
#include <string>
#include <sstream>
std::string current_time()
{
const auto now_ms = date::floor<std::chrono::milliseconds>(std::chrono::system_clock::now());
std::stringstream ss;
ss << date::make_zoned(date::current_zone(), now_ms);
return ss.str();
}
int main()
{
std::cout << current_time() << '\n';
}