boost完全开发指南第2章-处理时间4 (日期区间date_period)

本文介绍Boost库中日期区间(date_period)的使用方法,包括日期区间的基本操作、比较、日期判断及交集计算,并演示了如何利用日期迭代器(day_iterator)进行日期的增减操作。

日期区间

#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>

using namespace std;
using namespace boost::gregorian;

void test_date_period()
{
	date_period dp(date(2014,1,1), days(20));
        //days
        cout<<"days: "<<dp.days()<<endl;
       //begin
	cout<<"begin: "<<dp.begin()<<endl;
	cout<<"begin day: "<<dp.begin().day()<<endl;
	//last
	cout<<"last: "<<dp.last()<<endl;
	cout<<"begin day: "<<dp.last().day()<<endl;
	//end
	cout<<"end: "<<dp.end()<<endl;
	cout<<"end day: "<<dp.end().day()<<endl;
	cout<<dp<<endl;
	//compare two period
	date_period dp2(date(2014,2,1), days(10));
	bool ret = dp < dp2;
	cout<<"compare ret= "<<ret<<endl;
}

1、date_period表示了时间轴上一个左闭右开区间,端点是date对象。区间的左值必须小于右值。否则表示一个无效的区间,用成员函数is_null()来判断是否有效。

2、date_period的成员函数shift(days(n))将日期区间平移n天而长度不变,expend(days(n))将日期区间向二端延伸n天,相当于增加了2n天。

3、date_period判断某个日期是否在区间内,或者计算日期区间的交集:

(1)is_before()/ is_after() :日期区间是否在日期前或者后;

(2)contains() : 日期区间是否包含另一个区间或者日期;

(3)intersects():二区间是否存在交集;

(4)intersection();返回二区间交集,如无交集返回一个无效区间;

(5)is_adjacent():二时间区间是否相等。

4、日期迭代器:day_iterator, week_iterator, month_iterator和 year_iterator,分别以天、周、月和年为单位增减。

void test_iterator()
{
	//day iterator
	date d(2014,1,4);
	day_iterator d_iter(d);
	++d_iter;//increase 1 day
	assert(d_iter == date(2014,1,5));
	//year iterator
	year_iterator y_iter(*d_iter,3);//increase or decrease by 3 years
	assert(y_iter == d+days(1));
	++y_iter;//increase 3 years
	assert(y_iter->year() == 2017);
}

注意:日期迭代器虽然支持++, ->, *等操作,但是并不符合标准迭代器标准,没有difference_type, pointer, reference等内部类型的定义,不能使用std::advance()或者operator+=来前进或者后退,例如

day_iterator d_iter(day_clock::local_day());

++d_iter;//OK

d_iter+=5;//ERROR;

std::advance(d_iter, 5);//ERROR

5、类boost::gregorian::gregorian_calender提供了格里高利历的一些操作函数,其中提供了几个有用的静态函数如is_leap_year()判断年份是否为闰年,end_of_month_day()给定年份和月份,返回该月最后一天。






<think> 我们需要根据库文件名中的标识符来区分debug和release版本。通常,在Boost库中,文件名中的标识符含义如下: - "gd":表示debug版本(带有调试信息) - "s":表示静态链接到运行时库(static runtime) - 没有"gd"且没有"s"的通常是release版本(动态链接到运行时库) 但是注意,有些文件名中可能同时包含"s"和"gd"(如"sgd"),这表示静态链接的debug版本。 根据常见的Boost库命名规则: - mt:表示多线程(multithreaded) - gd:表示debug版本(通常包含调试信息) - s:表示静态链接(static linking)到运行库 - 没有这些后缀的通常为动态链接的release版本 根据上述规则,我们可以将文件分为: debug版本:文件名中包含"gd"(无论是否有"s") release版本:文件名中不包含"gd"(但可能包含"s",因为release版本也有静态链接和动态链接之分) 注意:有些release版本可能是静态链接(带"s")或动态链接(不带"s")。我们这里只根据debug和release来分,所以只要不包含"gd"就认为是release。 因此,我们可以这样分类: 文件列表: libboost_chrono-vc143-mt-gd-x64-1_86.lib -> debug (因为包含"gd") libboost_chrono-vc143-mt-x64-1_86.lib -> release (不包含"gd") libboost_date_time-vc143-mt-gd-x64-1_86.lib -> debug libboost_date_time-vc143-mt-s-x64-1_86.lib -> release (不包含"gd",尽管有"s") libboost_date_time-vc143-mt-sgd-x64-1_86.lib -> debug (包含"gd") libboost_date_time-vc143-mt-x64-1_86.lib -> release libboost_serialization-vc143-mt-gd-x64-1_86.lib -> debug libboost_serialization-vc143-mt-x64-1_86.lib -> release libboost_thread-vc143-mt-gd-x64-1_86.lib -> debug libboost_thread-vc143-mt-x64-1_86.lib -> release 因此,我们创建两个文件夹:debug和release,然后将上述文件分别放入对应的文件夹。 具体分配如下: debug文件夹: libboost_chrono-vc143-mt-gd-x64-1_86.lib libboost_date_time-vc143-mt-gd-x64-1_86.lib libboost_date_time-vc143-mt-sgd-x64-1_86.lib libboost_serialization-vc143-mt-gd-x64-1_86.lib libboost_thread-vc143-mt-gd-x64-1_86.lib release文件夹: libboost_chrono-vc143-mt-x64-1_86.lib libboost_date_time-vc143-mt-s-x64-1_86.lib libboost_date_time-vc143-mt-x64-1_86.lib libboost_serialization-vc143-mt-x64-1_86.lib libboost_thread-vc143-mt-x64-1_86.lib 注意:文件`libboost_date_time-vc143-mt-s-x64-1_86.lib`虽然没有"gd",但是有"s",这表示它是静态链接的release版本,所以放入release文件夹。 另外,没有出现同时包含"s"但不包含"gd"的debug版本(即没有"sg"但不带"d"的,因为"sgd"中的"gd"才是debug标志),所以按照上述规则即可。 总结:只要文件名中包含"gd"(即debug版本)就放入debug文件夹,否则放入release文件夹。 </think>### Boost库文件分类指南 根据Boost库命名规范,可以通过文件名中的标识符区分Debug和Release版本: #### 📁 **Debug版本文件**(包含调试符号) 特征:文件名中包含 `-gd-` 或 `-sgd-` ``` libboost_chrono-vc143-mt-gd-x64-1_86.lib libboost_date_time-vc143-mt-gd-x64-1_86.lib libboost_date_time-vc143-mt-sgd-x64-1_86.lib libboost_serialization-vc143-mt-gd-x64-1_86.lib libboost_thread-vc143-mt-gd-x64-1_86.lib ``` #### 📦 **Release版本文件**(优化后版本) 特征:文件名中包含 `-mt-` 但不含 `-gd-` 或 `-sgd-` ``` libboost_chrono-vc143-mt-x64-1_86.lib libboost_date_time-vc143-mt-s-x64-1_86.lib libboost_date_time-vc143-mt-x64-1_86.lib libboost_serialization-vc143-mt-x64-1_86.lib libboost_thread-vc143-mt-x64-1_86.lib ``` #### 文件夹结构建议 ``` Boost_Libraries/ ├── Debug/ # 存放所有带gd/sgd标识的文件 │ ├── libboost_chrono-vc143-mt-gd-x64-1_86.lib │ ├── libboost_date_time-vc143-mt-gd-x64-1_86.lib │ └── ... └── Release/ # 存放所有不带gd标识的文件 ├── libboost_chrono-vc143-mt-x64-1_86.lib ├── libboost_date_time-vc143-mt-s-x64-1_86.lib └── ... ``` #### 🔍 命名规则解析 | 标识符 | 含义 | 版本类型 | |--------|-----------------------|----------| | `gd` | 调试版本(带调试符号)| Debug | | `sgd` | 静态链接调试版本 | Debug | | `s` | 静态链接 | Release | | 无特殊 | 动态链接 | Release |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值