【问题标题】:std::chrono add days to current datestd::chrono 将天数添加到当前日期
【发布时间】:2017-02-08 13:31:34
【问题描述】:

我想使用 std::chrono 来根据有效期计算未来的日期。

有效期是一个整数,指定“从现在开始的天数”。那么如何使用 chrono lib 来查找 100 天后的日期呢?

【问题讨论】:

    标签: c++ c++11 chrono


    【解决方案1】:

    Howard Hinnant 的 date library 是免费的(开源);它通过日历服务扩展了<chrono>

    #include "date.h"
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
        using namespace std::chrono;
        auto now = system_clock::now();
        auto today = floor<days>(now);
        year_month_day future = today + days{100};
        std::cout << future << '\n';
    }
    

    上述程序使用system_clock::now() 获取当前时间,然后将time_point 截断为days 的精度。然后添加100 days 以找到未来的time_point,然后将其转换为{year, month, day} 结构供人类使用。

    目前的输出是:

    2017-05-19
    

    如果您想在没有第三方库的情况下进行此类计算,我强烈建议您创建一个 chrono::duration days,如下所示:

    using days = std::chrono::duration
        <int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
    

    现在您可以将days{100} 添加到system_clock::time_point

    【讨论】:

    • 看起来不错,我会跟进的。
    • 您是否计划在 std 的 &lt;chrono&gt; 中包含扩展?
    • @PiotrSkotnicki:正在努力:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0355r1.html 成功的机会是 50/50。
    • @HowardHinnant 50%?我没有看到任何竞争提案,这个可以满足我的所有需求,那么为什么会有头脑正常的人反对呢? Chrono TS 至少应该是不费吹灰之力的。
    • @TemplateRex:竞争提案是这对论文:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0215r0.html 和 open-std.org/jtc1/sc22 /wg21/docs/papers/2016/p0216r0.html 。这也是委员会中一个极具争议的话题。把 20 名委员会成员放在一个房间里,你会得到 25 种不同的意见,以正确处理这个话题。在我写这篇文章时,这些​​链接的服务器已关闭,但希望这是暂时的。
    【解决方案2】:

    假设你有一个time_point。要为该对象添加天数,您只需使用 operator+std::chrono::hours 即可:

    #include <chrono>
    std::chrono::system_clock::time_point t = std::chrono::system_clock::now();
    std::chrono::system_clock::time_point new_t = t + std::chrono::hours(100 * 24);
    

    【讨论】:

    • 也可以using namespace std::litterals,然后写new_t = t + (100 * 24h),只是为了风格
    • 好的,太好了,我可以将 time_point 转换为 epoch 吗?我想以可从其他服务移植的格式将那一刻存储在数据库中
    • @DragonRock 现在编辑您的评论为时已晚,但正确的拼写是 std::literals,它是 C++14
    • 如果您不希望整个 std::literals 在范围内,您可以更有选择性,使用 using namespace std::literals::chrono_literals
    【解决方案3】:

    chrono 库不包含日历功能。没有直接的方法可以准确地实现您的要求。

    您可以通过使用具有每天秒数的持续时间来找到未来 100 天的秒数的时间戳。但是 chrono 没有计算日期的工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多