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

时间:2017-03-16 14:33:23

标签: c++ linux date time

我希望能够将具有毫秒分辨率的本地时间和日期放入字符串中,如下所示:

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并除去最后一秒之外的所有数据并将其附加到时间戳,仍然希望有更清洁的方法。

任何人都能找到更好的解决方案吗?

1 个答案:

答案 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';
}