在一个类中,我有一个属性boost :: posix_time :: ptime,它引用了这样的日期和时间:
boost :: posix_time :: ptime p _;
在构造函数中,我可以传递值并设置它们没有问题。
my_class::my_class( ... )
: p_( boost::posix_time::ptime( boost::gregorian::date(y,M,d),
hours(h) + minutes(m) + seconds(s) +
milliseconds(ms) + microseconds(us) +
nanosec(ns));
我想为此ptime的所有字段(年,月,日,小时......,如果可能)创建set方法(加和减)。
如果我使用ptime_.date(),它会返回日期的cons参考,我无法直接设置它。
我想做这样的事情:
void my_class::set_year(qint64 y) {
// p_.date().year = y;
}
这可能吗?
我正在考虑创建一个重置(...)方法,并设置我需要的东西,但这听起来很奇怪(复制所有值并在代码中重复它们)。
RGDS。
答案 0 :(得分:4)
在boost ptime的说明中,我们可以阅读:
类boost :: posix_time :: ptime是时间的主要接口 点操纵。通常,ptime类是一次不可变的 尽管它确实允许分配。 (...)提供了将posix_time对象转换为和tm结构的函数以及从time_t和FILETIME的转换。
因此可以使用转换为时间struct tm
。这个片段演示了这一点。
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/date.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
/*
*
*/
using namespace boost::posix_time;
using namespace boost::gregorian;
void set_year( uint64_t y, ptime& p) {
tm pt_tm = to_tm( p);
pt_tm.tm_year = y - 1900;
p = ptime_from_tm( pt_tm);
}
int main(int argc, char** argv) {
ptime t1( date(2002,Feb,10), hours(5)+minutes(4)+seconds(2));
std::cout << to_simple_string( t1) << std::endl;
set_year( 2001, t1);
std::cout << to_simple_string( t1);
}
输出:
2002-Feb-10 05:04:02
2001-Feb-10 05:04:02
答案 1 :(得分:2)
你所描述的是你应该做的。
Posix Time为posix时间戳建模,与API相比非常简约:
简介
类
boost::posix_time::ptime
是时间点操作的主要接口。一般来说,ptime
类一旦构建就不可变,尽管它允许分配。
所以你拥有它:如果你想改变它,那么假设分配一个新的ptime。
我只能想象一下这个场景,当你希望用户输入完全保真的时间值时。在这种情况下,我可能会将UI元素绑定到每个时间部分的单独字段,并将来自它们的字符串表示拼凑在一起。
然后,将您的字符串解析为ptime
,以便您拥有
ptime
提交支持不是为