在 boost::p osix_time 中设置值(年、月、日等)

set values (year, month, day...) in a boost::posix_time

本文关键字:日等 boost osix time 设置      更新时间:2023-10-16

在一个类中,我有一个属性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屈服以支持它不是为之而设计的操作
  • 免费输入验证