gpt4 book ai didi

没有日期的 C++ 时间?

转载 作者:行者123 更新时间:2023-11-30 04:46:28 25 4
gpt4 key购买 nike

在 C++ 中处理没有日期的时间点的最佳方法是什么?

我有没有日期的时间戳。时间戳适用于 24 小时军用时间,没有日期、时区或其他信息。时间戳存储为字符串。

我需要完成两个任务:

  1. 存储时间戳表示的时间数据。
  2. 计算时间之间的差异。

我知道 C++ 有包含时间数据结构的库。其中一些数据结构包括有关日期的信息。如果可能的话,我不想使用那些类型的数据结构,因为我的数据不包括日期。我想要类似于

中时间数据结构的功能
  • 提升.Date_Time
  • 时间
  • 时间

但除了 24 小时军事时间(显式或隐式)之外,没有任何日期或其他任何存储。

我想要时间点对象不存储有关日期或除 24 小时军用时间以外的任何信息。我要

  1. 将我的时间戳字符串转换到这些对象上。

然后

  1. 找出结果时间点之间的差异(时间点之间的持续时间)。

实现此目标的最佳方法是什么?

我理想的解决方案涉及一个已经存在的标准或 Boost 库,并且避免存储任何关于日期、时区或除 24 小时军用时间以外的任何信息。我可能忽略了我已经提到的库之一(即 Boost.Date_Time、chrono 或 ctime)可能会满足我的需求。

最佳答案

一个想法是创建一个自定义的 chrono 时钟,可能称为 time_of_day_clock,然后创建一个 chrono::time_point 系列那。或者您可能只需要 seconds 精度时间(您对此并不清楚)。以下是在这样的时钟上创建 seconds 精度 time_point 所需的全部内容:

struct time_of_day_clock {};
using time_of_day = std::chrono::time_point<time_of_day_clock,
std::chrono::seconds>;

现在您可以创建几个辅助函数来在 std::stringtime_of_day 之间进行转换:

// Assume t is of the form HH:MM:SS
time_of_day
to_time_of_day(const std::string& t)
{
using namespace std::chrono;
auto parse = [&t](auto i) -> int
{
return (t[i]-'0')*10 + (t[i+1]-'0');
};
hours h{parse(0)};
minutes m{parse(3)};
seconds s{parse(6)};
return time_of_day{h+m+s};
}

// Format to HH:MM:SS
std::string
to_string(const time_of_day& t)
{
using namespace std;
using namespace std::chrono;
auto s = t.time_since_epoch();
assert(s >= 0s);
assert(s < 86400s);
auto h = duration_cast<hours>(s);
s -= h;
auto m = duration_cast<minutes>(s);
s -= m;
string r = "00:00:00";
auto print = [&r](auto i, auto j)
{
for (++j; i != 0; i /= 10, --j)
r[j] = i % 10 + '0';
};
print(h.count(), 0);
print(m.count(), 3);
print(s.count(), 6);
return r;
}

现在您拥有了执行以下操作的所有工具:

int
main()
{
auto t1 = to_time_of_day("17:15:23");
auto t2 = to_time_of_day("07:14:06");
std::cout << "t1 = " << to_string(t1) << '\n';
std::cout << "t2 = " << to_string(t2) << '\n';
auto d = t1 - t2;
std::cout << d.count() << "s\n";
auto t3 = t2 + d;
std::cout << "t3 = " << to_string(t3) << '\n';
}

输出:

t1 = 17:15:23
t2 = 07:14:06
36077s
t3 = 17:15:23

这为您提供类型安全:一天中的时间不会与持续时间混淆,但它们与有理代数互操作.

根据您的应用程序的需要/要求,在上面添加尽可能多的错误检查。

上述计划中有一个小问题:语言律师可能会提示整个事情是未定义的行为,因为 time_of_day_clock 不符合计时时钟要求。

现实情况是,除非您尝试在 time_of_day_clock 上调用 now(),或者使用 time_of_day 算法尝试这样做(或尝试访问嵌套类型的 time_of_day_clock)。如果您不小心这样做,结果将是编译时错误,而不是运行时错误,也不是未定义的行为。

我认为 time_pointClock 模板参数的要求过于严格,将尝试将它们减少到 实际需要 future 标准1.


1 Done .

关于没有日期的 C++ 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56721494/

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