【问题标题】:Time Lookup Table in C++11C++11 中的时间查找表
【发布时间】:2017-08-16 05:17:21
【问题描述】:

我有一个按时间键控的表格,例如

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 数据类型来表示我的时间。如何开发支持时区的解决方案?例如。我表中列出的时间可能是美国/中部时间,我可能想使用基于澳大利亚/悉尼的时间进行查询。

【问题讨论】:

    标签: c++11 chrono


    【解决方案1】:

    为了支持不同时区的当地时间,<chrono> 我推荐Howard Hinnant's free, open-source time zone library。该库建立在<chrono> 之上,并使用IANA time zone database 来管理时区。

    此外,要处理时区,您需要存储的不仅仅是一天中的时间。您将需要存储整个日期,因为时区的 UTC 偏移量通常会随日期而变化。 IE。 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&lt;std::chrono::seconds&gt; 在这些示例中是 ztzt2 的类型,我建议您存储它。在引擎盖下,这种类型是 {date::time_zone const*, std::chrono::time_point&lt;system_clock, seconds&gt;}(两个存储词)的配对。

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

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

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

    【讨论】:

    • 谢谢霍华德,你的库看起来很棒,不幸的是我无法安装任何额外的库。我只有标准库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多