【问题标题】:unix timestamp to boost::posix_time::ptime用于 boost::posix_time::ptime 的 unix 时间戳
【发布时间】:2010-11-13 03:25:50
【问题描述】:

我需要将具有自纪元以来秒数的双精度转换为ptime。我很确定一定有一种简单的方法可以做到这一点,但我找不到任何东西。谢谢。

编辑:原始时间戳是浮点数。我无法更改它,我不想失去亚秒级精度。

【问题讨论】:

  • 您确定需要双份吗?我认为它适合 int。
  • 是的,我需要加倍——它是我无法更改的界面的一部分。如果是几秒钟,那么您将无法捕获小数部分...和xkcd.com/607 :-)

标签: c++ boost unix-timestamp boost-date-time


【解决方案1】:

使用from_time_t() 转换函数。 time_t 是一个 UNIX 时间戳,即自纪元以来的秒数。

【讨论】:

  • time_t 不能包含秒的小数部分,但感谢您的回答
  • time_t 是几乎所有平台上的 UNIX 时间戳,但 C++ 标准并未指定此行为。所以要小心这个翻译。
【解决方案2】:

经过一番折腾,我想出了这个:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321))

我不确定这是最好的解决方案,但它似乎可以满足我的需求。

【讨论】:

  • 其实这是最好的解决方案,因为它没有假设time_t是基于1970-01-01的。 (虽然也许它可以分成几行:-))
【解决方案3】:

对于将提升日期/时间编译为默认微秒分辨率级别的机器,试试这个:

double ts = 1250524800.5;
// Use floor() here if seconds are always positive.
time_t secondsSinceEpoch = floor(ts);
long microsecondsSinceSecond =
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000);
boost::posix_time::ptime result =
    boost::posix_time::from_time_t(secondsSinceEpoch);
boost::posix_time::time_duration fractionalSeconds(0, 0, 0,
                                                   microsecondsSinceSecond);
result += fractionalSeconds;
cout << "Time stamp is " << result << endl;

我的 Linux 机器上的输出是“时间戳为 2009 年 8 月 17 日 16:00:00.500000”。

【讨论】:

  • 您可能希望在您的microsecondsSinceSecond 计算中添加一个+0.5 以获得四舍五入。否则你会遇到截断错误。虽然......我猜任何关心半微秒差异的人可能不会首先将时间戳存储在double中。
  • @Tom:你说得对,尽管我希望任何真正关心这种分辨率水平的人都会配置他们的 Boost 发行版以支持纳秒并对上面的代码进行适当的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多