在 boost::p osix_time::p time 和 mongo::D ate_t 之间转换
Convert between boost::posix_time::ptime and mongo::Date_t
是否有一种简洁的方法,或者一种普遍接受的方法可以从boost::posix_time::ptime
转换为mongo::Date_t
,然后再转换回来?
蒙戈助推
Boost 文档似乎不完整或不正确。它记录了一个函数date_from_tm
,该函数从tm
构造date
结构。但是,给出了以下示例:
tm pt_tm;
/* snip */
ptime pt = ptime_from_tm(pt_tm);
但是没有记录在案的功能ptime_from_tm
。但是,此头文件确实包含该函数。
所以,我至少可以从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);
提升到蒙戈
当涉及到相反的方向时,我有点卡住了。MongoDB文档相当不完整,相关的头文件没有很多有用的注释。基本上,Date_t
结构是由unsigned long long
毫秒计数构造的。我只能从 1970-1-1:00:00.00 时代假设。
因此,我目前从boost::posix_time::ptime
到mongo::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);
当然,我可能会将其折叠成一行,但似乎从一个日期/时间表示到另一个日期/时间表示并再次返回的整个往返过程变得复杂和混乱。
最后
有没有更好的方法?是否有人对这两个库都有更好的了解,并且对日期/时间编程有很好的理解,知道一种简洁、简单的方法来实现我想要实现的目标?
似乎您的解决方案从 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 小时。您可以在此处验证"总毫秒数"
基本上,Date_t 结构是由无符号的长毫秒计数构造的。我只能从 1970-1-1:00:00.00 时代假设。
你是对的。
我认为你的代码和你将要得到的一样好。 你必须以某种方式达到一个time_t的秒数,这似乎有点复杂。
- 使用ios:ate写入到流会覆盖现有文件
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- 使用 C++ iOS::ate 获取错误的文件大小
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- c++ get millsecond time
- "Feature X requires run-time support"的含义是什么?
- 如何传递以 "size determined at run time" 作为引用的动态分配数组?
- constexpr - "Evaluate value at compile time"到底是什么意思?
- "Time"库形式 Arduino 显示不正确的值
- 自定义 Python 构建 - time.so:未定义的符号:PyExc_ValueError
- C++名称查找来自 <time.h 的函数>