一种将 boost::posix_time::ptime 转换为 __int64 的方法
Posted
技术标签:
【中文标题】一种将 boost::posix_time::ptime 转换为 __int64 的方法【英文标题】:A way to turn boost::posix_time::ptime into an __int64 【发布时间】:2009-10-15 19:50:52 【问题描述】:有谁知道是否有将boost::posix_time::ptime
转换为__int64
值的好方法。 (我编译的是微秒版本,不是纳秒版本)。
我需要以某种方式执行此操作,因为我希望将生成的 __int64
存储在 union
类型中,该类型将原始数据用于高性能应用程序。像这样的某种 Memento 功能对我来说非常有用。如果可能的话,我想避免强制转换,但如果需要,我会求助于它们。
【问题讨论】:
是的,这就是我一直在想的。该文档一直将每个整数值称为“长”。非常烦人,特别是因为提供的示例显示了如何计算自 epoch 以来的秒数使用返回 long 的方法 【参考方案1】:将 ptime 转换为整数是毫无意义的,因为 ptime 是实际时间的抽象。基于整数的时间将该时间表示为从一个纪元开始的计数。您(可能)想要做的是从您的时间到您感兴趣的时代生成一个time_duration,然后使用 time_duration::ticks() 获取 64 位整数。您可能需要将结果缩放到所需的精度:
ptime myEpoch(date(1970,Jan,1)); // Or whatever your epocj is.
time_duration myTimeFromEpoch = myTime - myEpoch;
boost::int64_t myTimeAsInt = myTimeFromEpoch.ticks();
【讨论】:
啊哈......我想我错过了我可以减去 time_duration。谢谢,这很有帮助。【参考方案2】:来自文档: http://www.boost.org/doc/libs/1_40_0/doc/html/date_time/posix_time.html
boost::int64_t 滴答声() 返回持续时间类型的原始计数(如果调用 time_duration 是 special_value,将给出不可预测的结果)。 time_duration td(0,0,0, 1000); td.ticks() // --> 1000
【讨论】:
【参考方案3】:#include <boost/date_time/posix_time/posix_time.hpp>
// ...
uint64_t secondsSinceEpoch(const boost::posix_time::ptime& time)
namespace bpt = boost::posix_time;
const bpt::ptime epoch = bpt::from_time_t(0);
bpt::time_duration duration = time - epoch;
return duration.total_seconds();
// ...
namespace bpt = boost::posix_time;
const bpt::ptime now = bpt::second_clock::local_time();
uint64_t seconds = secondsSinceEpoch(now);
std::cout << "seconds: " << seconds << std::endl;
【讨论】:
【参考方案4】:使用 C++0x chrono 类很容易做到这一点,这些类基于 Boost 的时间/日期库的简化版本,但是查看 Boost 文档我看不到任何特别明显的东西。事实上,我能看到的唯一方法是调用to_tm
将其转换为标准C struct tm
,然后将字段相乘。这有点讨厌,但应该可以工作(尽管您需要小心闰秒等)。
【讨论】:
不幸的是,我还需要保留微秒分辨率,所以这不起作用。我看到一个from_ftime。太糟糕了,没有 to_ftime。这会让事情变得更容易。以上是关于一种将 boost::posix_time::ptime 转换为 __int64 的方法的主要内容,如果未能解决你的问题,请参考以下文章