我已经看到一些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”。
答案 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
会遇到同样的问题 - 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));
答案 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();