gpt4 book ai didi

c++ - 如何制作通用精度 ISO 时间戳生成器

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:13 26 4
gpt4 key购买 nike

我正在编写一个以 ISO 格式返回当前时间的实用程序函数。但是,我希望能够指定精度:

2017-04-28T15:07:37Z        //s
2017-04-28T15:07:37.035Z //ms
2017-04-28T15:07:37.035332Z //us

我有工作代码可以做到这一点,但是,我似乎找不到使它通用的方法:

string getISOCurrentTimestamp_us()
{
char iso_buf[30];

auto now = chrono::high_resolution_clock::now();
auto s = chrono::duration_cast<chrono::seconds>(now.time_since_epoch());
time_t seconds = (time_t) s.count();
strftime(iso_buf, sizeof(iso_buf), "%FT%T", gmtime(&seconds));

string iso_timestamp(iso_buf);

auto us = chrono::duration_cast<chrono::microseconds>(now.time_since_epoch());
auto us_diff = us - chrono::duration_cast<chrono::microseconds>(s);
char buffer[8];
std::snprintf(buffer, sizeof(buffer), ".%06d", (int) us_diff.count());

iso_timestamp += string(buffer);
iso_timestamp += "Z";

return iso_timestamp;
}

如您所见,这个只返回微秒版本。我有一个单独的函数使用 chrono:milliseconds对于毫秒版本。当唯一的区别是持续时间模板参数和零填充时,有这么多相似的代码似乎违反了 DRY。

然而,能够指定持续时间很棘手。我想我不太了解函数模板,因为我尝试过类似 getISOCurrentTimestamp<chrono::microseconds>() 的东西,无济于事:

template <class T>
string getISOCurrentTimestamp() {
...
auto t = chrono::duration_cast<T>(now.time_since_epoch());
auto t_diff = t - chrono::duration_cast<T>(s);
}

另一个问题是根据 T 推导零填充量这看起来也不是微不足道的(即微秒应该用零填充到 6,毫秒到 3,等等。

如何使这个 ISO 字符串函数通用?我是不是以错误的方式处理这个问题?

编辑:使用@HowardHinnant 的库,我能够编写一个通用包装器:

template <class Precision>
string getISOCurrentTimestamp()
{
auto now = chrono::system_clock::now();
return date::format("%FT%TZ", date::floor<Precision>(now));
}

调用使用:

string timestamp = getISOCurrentTimestamp<chrono::seconds>()

最佳答案

free, open-source, header-only library通过调整输入到 format 函数中的 chrono::time_point 的精度来实现。请随意检查代码以了解这是如何完成的。我想你会对 decimal_format_seconds 特别感兴趣它负责计算要输出多少小数位(如果有)。或者随意使用此代码。

这是使用它的样子:

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

int
main()
{
using namespace std;
using namespace std::chrono;
using namespace date;
system_clock::time_point now = sys_days{2017_y/04/28} + 15h + 7min + 37s + 35332us;
cout << format("%FT%TZ\n", floor<seconds>(now));
cout << format("%FT%TZ\n", floor<milliseconds>(now));
cout << format("%FT%TZ\n", floor<microseconds>(now));
}

输出:

2017-04-28T15:07:37Z
2017-04-28T15:07:37.035Z
2017-04-28T15:07:37.035332Z

关于c++ - 如何制作通用精度 ISO 时间戳生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com