如何从boost :: posix_time :: ptime获取自纪元时间以来的毫秒时间

时间:2011-08-11 00:27:19

标签: c++ datetime date boost time

我已经看到一些other answers on SO表示我们可以通过从“其他”时间减去纪元时间从毫秒中获取时间,但是当我尝试时它不起作用:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.000");

long diff = (other-epoch).total_milliseconds();

在这个阶段,差异是-1349172576,它应该是一个正数,因为“其他”时间是2011年。有人知道是什么原因引起的吗?从epoch开始,获得毫秒的正确方法是什么?

此外,我尝试从毫秒构建一个ptime对象:

ptime result = from_time_t(diff);

结果变成:“1927-Apr-01 13:50:24”,应该是“2011年8月9日17:27:00.000”。这里有什么问题?

更新

好的,所以我的错误源于我有2个程序,一个是C#(8字节/ 64位长)和一个C ++(4字节/ 32位长);无论如何,这里没有描述这种互动。

但是,当我使用long long时,值为正,但结果日期(构造from_time_t)仍然不正确:“2012-Oct-02 10:09:36”。

3 个答案:

答案 0 :(得分:6)

据推测,您所处的平台long小于64位。

我们假设它是32位 - 在这种情况下,long的最大值是2147483648.但it's been ~1312000000000 milliseconds since epoch,所以long显然不足以保持这个值,因此你“看到溢出。

我会做这样的事情:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.000");

time_duration const diff = other - epoch;
long long ms = diff.total_seconds();
ms *= 1000LL;
ms += diff.fractional_seconds() / 1000000L; // 1000L if you didn't build datetime
                                            // with nanosecond resolution

从指定的毫秒数创建ptime会遇到同样的问题 - ptimelong方面有效,而你有long long - 所以你基本上都是需要做相反的事情:

// given long long ms
time_duration t = seconds(static_cast<long>(ms / 1000LL));
if (ms % 1000LL)
    t += milliseconds(static_cast<long>(ms % 1000LL));

答案 1 :(得分:4)

ildjarn最佳解决方案的缩小版本:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.001");

time_duration const diff = other - epoch;
long long ms = diff.total_milliseconds();

这与它是否以纳秒分辨率构建无关。

答案 2 :(得分:1)

你可以尝试:

ptime other = time_from_string("2011-08-09 17:27:00.000");
time_t posix_time = (other - ptime(min_date_time)).total_seconds();