【问题标题】:set values (year, month, day...) in a boost::posix_time在 boost::posix_time 中设置值(年、月、日...)
【发布时间】:2014-04-15 20:05:28
【问题描述】:

在一个类中,我有一个属性 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 的所有字段(年、月、日、小时......如果可能的话)创建设置方法(加法和减法)。

如果我使用ptime_.date(),它返回一个日期的cons引用,我不能直接设置它。

我想做这样的事情:

void my_class::set_year(qint64 y) {
  // p_.date().year = y;
}

这可能吗?

我正在考虑创建一个 reset(...) 方法,并设置我需要的东西,但这听起来很奇怪(复制所有值并在代码中重复它们)。

Rgds.

【问题讨论】:

    标签: c++ datetime boost


    【解决方案1】:

    boost ptime的描述中我们可以阅读:

    类 boost::posix_time::ptime 是时间的主要接口 点操作。一般来说,ptime 类是不可变的一次 构造虽然它确实允许分配。 (...) 提供了用于将 posix_time 对象与 tm 结构体相互转换以及从 time_t 和 FILETIME 转换的函数。

    所以转换为时间struct tm 并从中可以使用。这个 sn-p 演示了这一点。

    #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

    【讨论】:

      【解决方案2】:

      你描述的就是你应该做的。

      Posix Time 模拟了一个 posix 时间戳,它在 API 方面非常简约:

      简介

      boost::posix_time::ptime 类是时间点操作的主要接口。一般来说,ptime 类在构造后不可变虽然允许赋值

      所以你有了它:如果你想改变它,你应该分配一个新的 ptime。

      我只能为此设想一个场景,那就是您希望用户完全保真地输入时间值。在这种情况下,我可能会将 UI 元素绑定到每个时间部分的单独字段,然后将它们拼凑成一个字符串表示形式。

      然后,将你的字符串解析成ptime,这样你就拥有了

      • 没有笨拙的黑客可以击败 ptime 以支持它不适合的操作
      • 免费输入验证

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-13
        • 1970-01-01
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多