在一个类中,我有一个属性boost::p osix_time::p time,它指的是这样的日期和时间:
提升::p时间::p时间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_.date((,它会返回日期的 cons 引用,我无法直接设置它。
我想做这样的事情:
void my_class::set_year(qint64 y) {
// p_.date().year = y;
}
这可能吗?
我正在考虑创建一个 reset(...( 方法,并设置我需要的东西,但为此目的听起来很奇怪(复制所有值并在代码中重复它们(。
噗嗤。
在对升压时间的描述中,我们可以读到:
类 boost::p osix_time::p time 是 time 的主要接口 点操作。一般来说,ptime 类一次是不可变的 构造,尽管它确实允许分配。(...)提供了用于将posix_time对象转换为 tm 结构体和从 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-2月-10 05:04:02
2001-2月-10 05:04:02
你所描述的就是你应该做的。
Posix Time 对 posix 时间戳进行建模,它在 API 方面非常简约:
介绍
类
boost::posix_time::ptime
是时间点操作的主要接口。通常,ptime
类一旦构造就不可变,尽管它确实允许赋值。
所以你有它:如果你想改变它,你应该分配一个新的 ptime。
我只能想象一个场景,那就是您希望用户以完全保真度输入时间值的时候。在这种情况下,我可能会将 UI 元素绑定到每个时间部分的单独字段,并从中拼凑出一个字符串表示形式。
然后,将字符串解析为ptime
这样你就会有
- 没有笨拙的黑客攻击来击败
ptime
屈服以支持它不是为之而设计的操作 - 免费输入验证