一个用到Boost中time_duration类而产生的bug

测试小组在ClearQuest上提交的Defect显示,程序在输入1940年以前日期时逻辑异常。经定位,发现是boost date_time库编译时time_duration的ticks数据类型为__int64导致数据溢出。最终将计算方式改成用DATE_DURATION,问题得以解决。

测试小组提交在ClearQuest上的一个Defect引起了我的注意,当一个逻辑中输入日期为1940年以前的任何一个值时,会产生异常,程序逻辑不正常,直觉告诉我,这有可能是其中用到时间比较时出了错,果不其然,在经过仔细定位后发现一段程序:

而跟踪到这里时发现,计算出的这个diff居然是负值!

仔细查阅文档,发现我的boost date_time库在编译时选择了time_duration的ticks数据类型为__int64,此时发生了数据溢出:)

65*365*24*60*60*1000000000

   boost::posix_time::time_duration diff = util::ptime_now() - util::oletime_to_boosttime(dateOfBirth);
   if( diff.is_negative() || diff > boost::posix_time::hours(200*365*24) )
     return E_INVALIDARG;
   }

改成用DATE_DURATION来计算就没有问题了

    boost::gregorian::date_duration diff = boost::gregorian::day_clock::local_day()- util::oledate_to_boostdate(dateOfBirth);

    if( diff.is_negative() || diff > boost::gregorian::date_duration(200*365) )
     return E_INVALIDARG;
   }


### 构造 `ptime` 对象的方法 在 Boost.DateTime 中,`ptime` 型表示一个具体的时间点,通常由日期(`date`)和时间间隔(`time_duration`)组成。可以通过多种方式构造 `ptime` 对象,包括使用 `date` 和 `time_duration` 的组合,以及利用迭代器(如 `day_iterator`)配合时间间隔来构造。 #### 使用 `date` 和 `time_duration` 构造 `ptime` 可以直接通过 `boost::gregorian::date` 表示日期,以及 `boost::posix_time::time_duration` 表示时间间隔来构造 `ptime`: ```cpp #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/gregorian/gregorian.hpp> int main() { boost::gregorian::date d(2024, 5, 1); boost::posix_time::time_duration td = boost::posix_time::hours(12) + boost::posix_time::minutes(30); boost::posix_time::ptime pt(d, td); } ``` 上述代码中,`ptime` 对象 `pt` 代表 2024 年 5 月 1 日 12:30:00 的时间点[^2]。 #### 使用 `day_iterator` 构造 `ptime` `day_iterator` 是 Boost 提供的日期迭代器,用于按天递增或递减日期。结合 `time_duration`,可以构造出特定的 `ptime` 对象。例如,从某个日期开始,逐天增加并构造新的时间点: ```cpp #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/gregorian/gregorian.hpp> int main() { boost::gregorian::date start_date(2024, 5, 1); boost::posix_time::time_duration time_of_day = boost::posix_time::hours(12); for (boost::gregorian::day_iterator day_it(start_date); day_it < start_date + boost::gregorian::days(3); ++day_it) { boost::posix_time::ptime pt(*day_it, time_of_day); } } ``` 该示例中,`day_iterator` 从 2024 年 5 月 1 日开始,逐天递增,每次构造一个新的 `ptime` 对象,时间固定为 12:00:00[^1]。 #### 使用 `time_iterator` 构造 `ptime` `time_iterator` 可用于按固定时间间隔(如分钟、小时)递增时间点。例如,从某一时间点开始,每隔 10 分钟生成新的 `ptime` 对象: ```cpp #include <boost/date_time/posix_time/posix_time.hpp> int main() { boost::posix_time::ptime start_time(boost::gregorian::date(2024, 5, 1), boost::posix_time::hours(10)); for (boost::posix_time::time_iterator it(start_time, boost::posix_time::minutes(10)); it < start_time + boost::posix_time::hours(1); ++it) { boost::posix_time::ptime pt = *it; } } ``` 此代码中,`time_iterator` 从 2024 年 5 月 1 日 10:00:00 开始,每 10 分钟生成一个新的 `ptime` 对象,直到 11:00:00 为止。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值