C ++ 11中的时间查找表

时间:2017-08-16 05:17:21

标签: c++11 chrono

我有一张按时间键入的表格,例如

time | valA | valB
---- | ---- | ----
09:00| 1.4  | 1.2
09:05| 1.5  | 1.4  
09:10| 1.5  | 1.4

我希望将其存储在数据结构中并查询任意时间的值。例如。

asof 09:01, valA = 1.4
asof 09:06, valB = 1.4
asof 09:14, valA = 1.5

在c ++ 11中构造这个的最佳方法是什么?我应该使用哪个std :: chrono数据类型来表示我的时间。如何开发支持时区的解决方案?例如。我的表中列出的时间可能是美国/中部时间,我可能想要使用澳大利亚/悉尼时间进行查询。

1 个答案:

答案 0 :(得分:0)

要使用<chrono>支持不同时区的当地时间,我建议Howard Hinnant's free, open-source time zone library。此库构建于<chrono>之上,并使用IANA time zone database来管理时区。

此外,要处理时区,您需要存储的不仅仅是时间。您需要存储整个日期,因为时区的UTC偏移通常随日期而变化。即09:05 Australia/Sydney并没有真正确定时刻。但2017-08-16 09:05 Australia/Sydney确实如此。

以下是使用<chrono>和时区库创建此类时间戳的方法:

using namespace date;
using namespace std::chrono;
auto zt = make_zoned("Australia/Sydney", local_days{2017_y/aug/16} + 9h + 5min);

你可以像这样打印出来:

std::cout << zt << '\n';

输出是:

2017-08-16 09:05:00 AEST

如果您想了解美国/中部的当地时间对应于同一时刻:

auto zt2 = make_zoned("US/Central", zt);
std::cout << zt2 << '\n';

输出是:

2017-08-15 18:05:00 CDT
在这些示例中,

date::zoned_time<std::chrono::seconds>ztzt2的类型,这就是我建议您存储的内容。在引擎盖下,这种类型是{date::time_zone const*, std::chrono::time_point<system_clock, seconds>}(两个存储词)的配对。

源代码:https://github.com/HowardHinnant/date

文档:http://howardhinnant.github.io/date/tz.html

视频:https://www.youtube.com/watch?v=Vwd3pduVGKY