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

Kir*_*ril 5 c++ time datetime boost date

我已经在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();
Run Code Online (Sandbox Code Playgroud)

在这个阶段差异是-1349172576,它应该是一个正数,因为"其他"时间是2011年.有人知道是什么原因造成的吗?从纪元开始,获得毫秒的正确方法是什么?

另外,我试图从毫秒开始构造一个ptime对象:

ptime result = from_time_t(diff);
Run Code Online (Sandbox Code Playgroud)

然后结果变为:"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".

ild*_*arn 6

大概你是在一个long小于64位的平台上.

假设它是32位 - 在这种情况下,a的最大值long是2147483648.但是,自纪元以来它已经是大约1312000000000毫秒,所以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
Run Code Online (Sandbox Code Playgroud)

ptime从指定的毫秒数创建一个具有相同的问题 - ptime按照long你的方式工作,你有一个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));
Run Code Online (Sandbox Code Playgroud)