如何在Linux中使用C++获取精确到毫秒的日期和时间字符串?

12 浏览
0 Comments

如何在Linux中使用C++获取精确到毫秒的日期和时间字符串?

我想要能够以毫秒分辨率将本地日期和时间放入字符串中,格式如下:

YYYY-MM-DD hh:mm:ss.sss

这似乎是一个简单的事情,但我没有找到一个简单的答案来实现这个。我在使用C++编写代码,可以使用C解决方案,只要代码更简洁即可。我在这里找到了一个解决方案Get both date and time in milliseconds,但使用标准库应该不会那么困难。我可能会使用那种解决方案继续进行,但希望通过在这里提问来增加知识库。

我知道这段代码可以工作,但看起来过于复杂:

#include 
#include 
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++的put_time和旧的C方式的strftime。据我所知,两者都只能以秒为单位进行解析。下面是我迄今为止得到的两种方法。我想将其放入一个字符串中:

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
0 Comments

在Linux中,如何以毫秒精度获取日期和时间字符串?

问题的原因是需要以毫秒精度获取当前日期和时间,并将其转换为字符串格式。下面是一种解决方法:

我建议查看Howard Hinnant的date库。在该库的wiki中提供了一个示例,展示了如何获取当前本地时间,以给定的std::chrono::system_clock实现的精度为准(从内存中获取的是纳秒精度,Linux下可能也是如此):

编辑:正如Howard在评论中指出的那样,您可以使用date::floor()来获得所需的精度。因此,要生成问题中要求的字符串,您可以这样做:

#include "tz.h"
#include 
#include 
#include 
std::string current_time()
{
    const auto now_ms = date::floor(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';
}

这段代码会输出当前时间的字符串表示。

这个解决方法使用了Howard Hinnant的date库来处理日期和时间。通过调用std::chrono::system_clock::now()获取当前时间,然后使用date::floor()函数将其截断为毫秒精度。接下来,使用date::make_zoned()将时间转换为指定的时区,并使用stringstream将其转换为字符串。

这种方法可以获得毫秒精度的日期和时间字符串。使用这个解决方法,您可以在Linux上以毫秒精度获取日期和时间字符串。

0