1

是否有一个C++11版本的matlabsdatenum函数#include<chrono>

由于这篇文章,我已经知道它存在于 boost 中

4

2 回答 2

2

不,那里没有。但是,这里有一个“操作指南”手册,介绍了如何为chrono兼容的日期库编写算法。使用这些算法,我可以轻松地执行以下操作:

#include "../date_performance/date_algorithms"
#include <ratio>
#include <chrono>
#include <iostream>

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

typedef std::chrono::time_point<std::chrono::system_clock, days> date_point;

int
main()
{
    using namespace std::chrono;
    date_point datenum{days{days_from_civil(2014, 2, 5)}};
    auto d = system_clock::now() - datenum;
    auto h = duration_cast<hours>(d);
    d -= h;
    auto m = duration_cast<minutes>(d);
    std::cout << "The current UTC time is "  << h.count() << ':' << m.count() << '\n';
    date_point datenum2{days{days_from_civil(2014, 3, 5)}};
    std::cout << "There are " << (datenum2-datenum).count() << " days between 2014-03-05 and 2014-02-05\n";
}

对我来说输出:

The current UTC time is 22:12
There are 28 days between 2014-03-05 and 2014-02-05

您需要做的第一件事是创建一个chrono::duration代表一天,days如上所述。chrono::time_point然后根据持续时间创建一个很方便days。这time_point与每个已知的实现兼容system_clock::time_point。即你可以减去它们。

now()在此持续时间内,我从当前日期中减去以获取 UTC 时区一天中的小时数::分钟数。我还演示了如何计算任意两个日期之间的天数。

随意使用这些算法,也许将所有这些都包装在一个类型安全的日期类中。该链接仅提供算法,而不是实际的日期类。

如果我有时间的话,我将来可能会发布一个基于这些算法的日期类......

于 2014-02-05T22:14:47.020 回答
1

我不知道 matlabs datenum 是什么,但这里是如何做与您链接到的问题的公认答案基本相同,即时间点和持续时间的算术,但在 C++11 中没有提升:

#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;

int main() {
    duration<long> one_day{ hours(24) };
    system_clock::time_point now = system_clock::now();
    system_clock::time_point tomorrow = now + one_day;
    time_t t = system_clock::to_time_t(tomorrow);
    cout << "Tomorrow: " << ctime(&t) << '\n';
}

希望这可以帮助。

于 2014-01-30T13:33:09.627 回答