2016-06-07 58 views
1

我有下面的代码从了posix_timeboost :: posix_time :: time_duration溢出?

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() 

获得UNIX时间给我这个输出

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

现在diff不应该是一个负数。我如何计算这个权利?有溢出吗?

+0

'长long',但'diff'已经是负 – user2071938

+0

这可能是你在找什么:HTTPS://en.wikipedia .org/wiki/Year_2038_problem – stefaanv

+0

我不能用最初的32位为unix时间 – user2071938

回答

-1

您可以始终通过从零中减去正值/负值来反转。

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

编辑1:额外信息;

此外,你的公式time1-epoch将计算2个时间点之间的差异。您应该将差异添加到当前可能导致您喜欢的时间。 (消极的结果是一个逻辑上的差异)。

+0

是的,但我希望unix时间,这是(秒钟'1970-1-1')。负数并不意味着错误的结果,但在这种情况下,'9999-12-31'比1970-1-1更晚,所以如果没有溢出,我认为结果应该是正值。 – user2071938

+0

从[WikI Unix时间](https://en.wikipedia.org/wiki/Unix_time):“最大可表示时间是2038-01-19星期二”。你有一个千年虫;-) – 2016-06-07 07:29:15

+0

我不工作与最初的32位的Unix时间 – user2071938

-1

如果你有C++ 11,或许<chrono>加上这个free open source date library它延伸<chrono>可以帮助吗?

#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 
+0

这个库可以处理纳秒精度吗? – user2071938

+0

@ user2071938:是,否。 ''有一个名为'nanoseconds'的类型,存储在'int64_t'中。这给了它一个+/- 292年的范围,这个例子的范围不够。如果你有128位的类型,你可以创建你自己的纳秒类型:'使用纳秒= std :: chrono :: duration <__ int128_t,std :: nano>;'。这将有足够的范围为您的例子。 –

+0

在我的系统上'__int128_t'很难处理。例如,你不能将它流出到“cout”。 –

0

(顺便说一句 - 我用coliru下面的输出,和我的本地GCC 5.3.1与提升1.60再生)

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

A: 9999-Dec-31 00:00:00 
B: 1970-Jan-01 00:00:00 
C: 70389504:00:00 

所以,差(E按小时计算)为70389504小时。其以秒为:

70389504 * 60 * 60 =>253402214400秒

现在,在图书馆的内部,存在用于sec_type默认为boost::int32_t一个类型DEF。因此,除非设置为int64_t,否则上述值将溢出。

至于如何重写,除非你砍的date_time库,并改变从boost::int32_ttime_resolution_traits.h的默认boost::int64_。(有可能是另一种方式,它是不可能的,但我没有详细研究代码足以告诉你这将是什么..)

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

+0

thx!是的,我已经设置了'DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG'。是否有机会检测溢出? – user2071938

+0

Erm,如果设置了标志,就会破坏库的设置以将'sec_type'(真的是'var_type')的大小设置为64位,这是没办法的......你可以提交一个错误报告,看看是否他们会修复它的下一个版本? – Nim

+0

...或者使用霍华德强调的上面的库 - 它似乎能够处理你之后的范围...... – Nim

0

这在升压:: DATE_TIME一个已知问题:https://svn.boost.org/trac/boost/ticket/3109

甲TIME_DURATION可以代表比秒升压的类型:: TIME_DURATION :: total_seconds()可以代表数大的间隔。

如果你需要的总秒数,更好地利用

time_duration td = ... 
auto seconds = td.ticks()/time_duration::ticks_per_seconds(); 
相关问题