2

我有以下代码从 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

4 回答 4

0

(顺便说一句 - 我在下面的输出中使用了 coliru,我的本地 gcc 5.3.1 和 boost 1.60 重现)

问题是你想要这个数字以秒为单位,所以让我们尝试一些基本的数学运算(看看我是否做对了!):)

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

所以差异(以小时表示)为 70389504 小时。在几秒钟内是:

70389504 * 60 * 60 => 253402214400 秒

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

至于如何覆盖它,除非您破解date_time库并将默认值time_resolution_traits.h从更改boost::int32_tboost::int64_.. (可能有另一种方法,但我没有详细调查代码以告诉您那将是什么,否则这是不可能的) ..)

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

于 2016-06-07T17:13:24.783 回答
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();
于 2016-07-22T10:43:04.443 回答
-1

如果你有 C++11,或许<chrono>再加上这个扩展的免费开源日期库<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
于 2016-06-07T15:23:08.037 回答
-1

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

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

编辑1:额外信息;

此外,您的公式 time1-epoch 将计算 2 个时间点之间的差异。您应该将差异添加到当前时间,这可能会符合您的喜好。(负面结果是逻辑上的差异)。

于 2016-06-07T06:54:27.440 回答