【问题标题】:Convert between boost::posix_time::ptime and mongo::Date_t在 boost::posix_time::ptime 和 mongo::Date_t 之间转换
【发布时间】:2012-06-11 01:58:16
【问题描述】:

是否有一种简洁的方式,或者一种普遍接受的方式来从 boost::posix_time::ptime 转换为 mongo::Date_t 并再次转换回来?

Mongo 到 Boost

Boost documentation 似乎不完整或不正确。它记录了一个函数date_from_tm,它从tm 构造一个date 结构。但是,给出了以下示例:

tm pt_tm;
/* snip */
ptime pt = ptime_from_tm(pt_tm);

但是没有记录的函数ptime_from_tm。但是this header file 确实包含该功能。

所以,我至少可以从mongo::Date_t 转到boost::posix_time::ptime

mongo::Date_t d = ...;
std::tm t;
d.toTm(&t);
boost::posix_time::ptime pt = ptime_from_tm(t);

提升到 Mongo

当涉及到相反的方向时,我有点卡住了。 MongoDB documentation 相当不完整,关联的 header file 没有很多有用的 cmets。基本上,Date_t 结构是从unsigned long long 毫秒计数构造的。我只能假设从 1970-1-1:00:00.00 时代开始。

所以我目前从boost::posix_time::ptimemongo::Date_t 的解决方案是:

boost::posix_time::ptime pt = ...;
std::tm pt_tm = boost::posix_time::to_tm(pt);
std::time_t t = mktime(pt_tm);
mongo::Date_t d(t);

当然,我可能可以将其合并为一行,但似乎从一个日期/时间表示到另一个日期/时间表示再返回的整个往返过程变得令人费解和混乱。

终于

有没有更好的方法?有谁对这两个库有更好的了解并且对日期/时间编程有很好的理解,是否知道一种简洁、简单的方法来实现我想要实现的目标?

【问题讨论】:

  • mktime(pt_tm) 应该是 mktime(&pt_tm)?并做一个从ptime到Date_t的转换,结果不正确。 ptime 是“2011-10-28 23:30:30.000”,但我在 Date_t 中得到“Fri Jan 16 13:36:55 1970”。 mongo 驱动程序 2.4.3,提升 1530

标签: c++ datetime mongodb boost


【解决方案1】:

您的解决方案从 ptime 转换为 Date_t 似乎有一些问题,我尝试了它并得到了不正确的结果,正如我评论的那样。 我有更好的办法:

mongo::Date_t convert(const boost::posix_time::ptime& time)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970,boost::date_time::Jan,1));
    boost::posix_time::time_duration d = time - epoch;
    return mongo::Date_t(d.total_milliseconds());
}
boost::posix_time::ptime convert(const mongo::Date_t& time)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970,boost::date_time::Jan,1));
    boost::posix_time::time_duration d = boost::posix_time::milliseconds(time.millis);//- epoch;
    return boost::posix_time::ptime(epoch+d);
}

请注意,2.4.3(据我所知) Date_t::toString() 有错误,“日期”已添加 8 小时。您可以在here 验证“总毫秒数”

【讨论】:

    【解决方案2】:

    基本上,Date_t 结构体是由 unsigned long long 毫秒计数构成的。我只能假设从 1970-1-1:00:00.00 时代开始。

    你是对的。

    我认为您的代码与您将获得的一样好。你必须以某种方式到达一个类似于 time_t 的 seconds-since-the epoch,这似乎是带有 ptime 的a little complex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2010-11-13
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多