在boost :: posix_time中设置值(年,月,日......)

时间:2014-04-15 20:05:29

标签: c++ datetime boost

在一个类中,我有一个属性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。

2 个答案:

答案 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提交支持不是为
  • 而设计的行动
  • 免费输入验证