gpt4 book ai didi

c++ - 在 C++11 中解析毫秒日期时间的最佳方法是什么

转载 作者:可可西里 更新时间:2023-11-01 15:23:00 26 4
gpt4 key购买 nike

当我们有带毫秒的日期时间字符串时,strptime 的下一个最佳选择是什么?

给定:

"30/03/09 16:31:32.121"

我们不能使用常规的 strptime,因为 struct tm 不存储毫秒数。是否有可以实现此目的的新类?

最佳答案

我会手动解析这些字段(读入 int 和 double 秒),然后使用 days_from_civil将年/月/日转换为 chrono::system_clock::time_point:

std::chrono::system_clock::time_point t(days(days_from_civil(y, m, d)));

days 是:

using days = std::chrono::duration<int, std::ratio<86400>>;

然后您可以添加小时、分钟和秒。要处理小数秒,您需要跳一段小舞:

double s;
your_stream >> s; // 32.121
using namespace std::chrono;
duration<double> dsecs(s);
seconds sec = duration_cast<seconds>(dsecs);
milliseconds ms = duration_cast<milliseconds>(dsecs - sec);
t += sec + ms;

如果您愿意,请使用 round from here对于您的毫秒转换:

milliseconds ms = round<milliseconds>(dsecs - sec);

duration_cast 被截断为零。还有其他舍入模式:floor、round、ceil、at this link .

将其全部封装在一个简洁的函数中,以便于重复使用。 :-)

以上代码均采用UTC。如果已知您正在解析的日期/时间与 UTC 有偏差,则可以添加/减去该偏差。 system_clock 轨道的所有已知实现 Unix time , 这是自 UTC 时区 1970-01-01 以来的秒数。

更新

自从写下这个答案后,我开发了一个 more general library OP当时似乎正在寻找。它可以将各种亚秒级精度直接解析为 std::chrono::system_clock::time_point,如下所示:

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

int
main()
{
std::istringstream in{"30/03/09 16:31:32.121\n"
"30/03/09 16:31:32.1214"};
std::chrono::system_clock::time_point tp;
in >> date::parse("%d/%m/%y %T", tp);
using namespace date;
std::cout << tp << '\n';
in >> date::parse(" %d/%m/%y %T", tp);
std::cout << tp << '\n';
}

这个输出:

2009-03-30 16:31:32.121000
2009-03-30 16:31:32.121400

此库使用与我最初描述的相同的技术和工具,但已打包并准备好作为单个头文件库使用。

关于c++ - 在 C++11 中解析毫秒日期时间的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537656/

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