一种将 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 的方法的主要内容,如果未能解决你的问题,请参考以下文章

csharp 一种将输入图像转换为不同格式的简单工具。

一种将基类型转换为派生类型的方法

一种将UML类图转化成XML 文档模式的方法

一种将(添加隐私)封装到 MVC 中的模型的方法?

一种将用户输入分配给变量然后跨组件共享该变量的方法

MySQL - 一种将所有找到的行加入一列的方法