我有以下代码从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
不应该是负数。我该如何计算呢?有溢出吗?
答案 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