我有一张按时间键入的表格,例如
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数据类型来表示我的时间。如何开发支持时区的解决方案?例如。我的表中列出的时间可能是美国/中部时间,我可能想要使用澳大利亚/悉尼时间进行查询。
答案 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>
是zt
和zt2
的类型,这就是我建议您存储的内容。在引擎盖下,这种类型是{date::time_zone const*, std::chrono::time_point<system_clock, seconds>}
(两个存储词)的配对。
源代码:https://github.com/HowardHinnant/date