boost :: posix_time :: time_duration溢出?

时间:2016-06-07 06:41:13

标签: c++ boost boost-date-time

我有以下代码从posix_time获取UNIX时间

boost::posix_time::ptime time1(boost::gregorian::date(9999,12,31));
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));

boost::posix_time::time_duration diff = time1-epoch;
cout<<"A: "<<time1<<endl;
cout<<"B: "<<epoch<<endl;
cout<<"C: "<<diff<<endl;

unix_time = diff.total_seconds()

给我这个输出

9999-Dec-31 00:00:00
1970-Jan-01 00:00:00
-1347834:03:51.933722624

现在diff不应该是负数。我该如何计算呢?有溢出吗?

4 个答案:

答案 0 :(得分:0)

(顺便说一句 - 我使用coliru作为下面的输出,我的本地gcc 5.3.1使用boost 1.60再现)

问题是你想要在几秒钟内得到这个数字,所以让我们尝试一些基本的数学(看看我是否正确!):)

sec_type

因此差异(以小时表示)为70389504小时。以秒为单位:

70389504 * 60 * 60 =&gt; 253402214400秒

现在,在库的内部,boost::int32_t有一个类型def,默认为int64_t。因此,除非将其设置为date_time,否则上述值将溢出。

至于如何覆盖这一点,除非您破解time_resolution_traits.h库,并将boost::int32_t中的默认值从boost::int64_更改为-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG,否则无法实现此操作..(可能有另一种方式,但我还没有详细调查代码,足以告诉你那将是什么..)

现在对于你的真正问题,似乎你有这个集合{{1}} - 我怀疑你想要纳秒精度?如果是这样,我认为你必须减少支持的日期范围。

答案 1 :(得分:0)

这是boost :: date_time中的一个已知问题:https://svn.boost.org/trac/boost/ticket/3109

time_duration可以表示比boost :: time_duration :: total_seconds()的类型可以表示的秒数更大的间隔。

如果您需要总秒数,请更好地使用

time_duration td = ...
auto seconds = td.ticks() / time_duration::ticks_per_seconds();

答案 2 :(得分:-1)

你总是可以通过从零中减去它来反转正/负。

diff = 0 - diff; // if diff was negative it will be positive now.

编辑1:额外信息;

另外,你的公式time1-epoch将计算2个时间点之间的差异。您应该将diff添加到当前时间,这可能会产生您喜欢的结果。 (负面结果是合乎逻辑的差异)。

答案 3 :(得分:-1)

如果你有C ++ 11,那么<chrono>加上延伸<chrono>的{​​{3}}可能会有所帮助吗?

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date::literals;
    auto time1 = 9999_y/dec/31;
    auto epoch = 1970_y/jan/1;
    std::chrono::seconds diff = date::sys_days{time1} - date::sys_days{epoch};
    std::cout << "A: " << time1 << '\n';
    std::cout << "B: " << epoch << '\n';
    std::cout << "C: " << diff.count() << '\n';
}

输出:

A: 9999-12-31
B: 1970-01-01
C: 253402214400