boost datetime 时间日期

本文详细介绍了Boost日期时间库的使用方法,包括日期和时间的基本操作、时间区间计算、时区处理等内容。通过实例展示了如何进行日期计算、时间点运算及时间区间的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间日期头文件包含

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

	try
	{
		//boost::gregorian::date 的缺省构造函数会创建一个无效的日期
		boost::gregorian::date d(2017,12,23);
		TRACE("%d年%d月%d日,周%d,月结日%d\n",d.year(),d.month(),d.day(),d.day_of_week(),d.end_of_month().day());
		//当前时间日期
		boost::gregorian::date d2=boost::gregorian::day_clock::universal_day();
		TRACE("%d年%d月%d日,周%d,月结日%d\n",d2.year(),d2.month(),d2.day(),d2.day_of_week(),d2.end_of_month().day());
		//通过字符串构造
		boost::gregorian::date d3=boost::gregorian::date_from_iso_string("20171123");
		TRACE("%d年%d月%d日,周%d,月结日%d\n",d3.year(),d3.month(),d3.day(),d3.day_of_week(),d3.end_of_month().day());
		//返回时间区间,天数
		boost::gregorian::date_duration dd=d3-d2;
		TRACE("时间天数%d\n",dd.days());
		//构造8个星期
		boost::gregorian::weeks wk(8);
		TRACE("%d\n",wk.days());//打印出 56
		//构造8个月的时间
		boost::gregorian::months mt(8);
		TRACE("%d\n",mt.number_of_months());//打印8
		//构造3年的时间
		boost::gregorian::years yr(3);
		TRACE("%d\n",yr.number_of_years());//打印3
		//当前日期 与 moths 相加,每次计算以月份的实际天数计算
		//当前日期 与 moths 相减,每次计算以月份的实际天数计算
		//如果您不想这样子计算,可以取消 BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES 的定义,取消后不能
		//boost::gregorian::weeks, boost::gregorian::months ,boost::gregorian::years和boost::gregorian::weeks都不能使用
		boost::gregorian::months mt_calc(1);
		boost::gregorian::date d_calc(2017,1,31);//以1月最后一日演示
		boost::gregorian::date d4=d_calc+mt_calc;
		TRACE("%d年%d月%d日\n",d4.year(),d4.month(),d4.day());//2017 02 28,20170131+1个月的时间表示递增到下一个月的结束日
		boost::gregorian::date d5=d4-mt_calc;
		TRACE("%d年%d月%d日\n",d5.year(),d5.month(),d5.day());//2017 1 31,20170228-1个月的时间表示回到上个月的月末,那么这个月份就结束了

		boost::gregorian::date d_calc_2(2017,1,1);//以1月最后一日演示
		boost::gregorian::date d6=d_calc_2+mt_calc;
		TRACE("%d年%d月%d日\n",d6.year(),d6.month(),d6.day());//2017 02 01,2017 01 01+1个月的时间表示递增到下一个月的起始日
		boost::gregorian::date d7=d6-mt_calc;
		TRACE("%d年%d月%d日\n",d7.year(),d7.month(),d7.day());//2017 1 1,2017 02 01-1个月的时间表示回到上个月的起始日

		//date_period 时间周期使用,还提供了其它方法,如移动一个区间,或计算两个重叠区间的交集
		boost::gregorian::date d8(2017, 1, 30); //2017 01 30 是开始计算的日期
		boost::gregorian::date d9(2017, 2, 1); // 2017 02 01 的前一天才是开始计算的日期,换句话就是2017 01 31
		boost::gregorian::date_period dp(d8, d9); 
		boost::gregorian::date_duration dd_dp = dp.length(); 
		TRACE("天数,%d\n",dd_dp.days());//输出两天
		TRACE("d8包含情况,%d\n",dp.contains(d8));
		TRACE("d9包含情况,%d\n",dp.contains(d9));//从这里可以看到date_period的计算情况,并不包含了2017 02 01

		//boost::gregorian::day_iterator 可以通过操作迭代器,递减递增每天
		//还有 boost::gregorian::week_iterator, boost::gregorian::month_iterator 和 boost::gregorian::year_iterator 分别提供了按周、按月或是按年跳的迭代器
		boost::gregorian::date d10(2017, 1, 5); //周三
		boost::gregorian::day_iterator it(d10); 
		boost::gregorian::date d11=*++it;//递增1天,周四
		TRACE("%d年%d月%d日\n",d11.year(),d11.month(),d11.day());//2017年1月6日
		//计算下一个周五的日期,如果当前日期是周五则返回今天,否则返回下一个周五的日期
		boost::gregorian::date d12=boost::date_time::next_weekday(*it, boost::gregorian::greg_weekday(boost::date_time::Friday));
		TRACE("%d年%d月%d日\n",d12.year(),d12.month(),d12.day());//2017年1月6日
	}
	catch (std::exception& e)
	{
		TRACE("%s\n",e.what());
	}

#include <boost/date_time/posix_time/posix_time.hpp>

	try
	{
		//与位置无关的时间点
		//设置,2017 01 01 经过12 小时的点的时间,2017 01 01 12PM
		//boost::posix_time::ptime 可以传递一个 boost::date_time::not_a_date_time 创建一个无效的时间
		boost::posix_time::ptime pt(boost::gregorian::date(2017,1,1),boost::posix_time::time_duration(12,0,0));
		boost::gregorian::date d_pt=pt.date();
		TRACE("%d年%d月%d日\n",d_pt.year(),d_pt.month(),d_pt.day());//输出2017 01 01
		boost::posix_time::time_duration td=pt.time_of_day();
		TRACE("小时%d,分钟%d,秒%d\n",td.hours(),td.minutes(),td.seconds());//小时12,分钟0,秒0

		//构造当前时间的点
		boost::posix_time::ptime pt2=boost::posix_time::second_clock::local_time();//使用本地时间,universal_time 返回UTC时间点,boost::posix_time::microsec_clock 
		TRACE("%d年%d月%d日\n",pt2.date().year(),pt2.date().month(),pt2.date().day());//
		TRACE("小时%d,分钟%d,秒%d\n",pt2.time_of_day().hours(),pt2.time_of_day().minutes(),pt2.time_of_day().seconds());//

		//字符串构造时间点
		boost::posix_time::ptime pt3=boost::posix_time::from_iso_string("20170101T120000");//ISO 8601格式的字符串
		TRACE("%d年%d月%d日\n",pt3.date().year(),pt3.date().month(),pt3.date().day());//输出2017 01 01
		TRACE("小时%d,分钟%d,秒%d\n",pt3.time_of_day().hours(),pt3.time_of_day().minutes(),pt3.time_of_day().seconds());//小时12,分钟0,秒0

		//时间长度,定义1小时,30分钟的长度,也就是持续时间
		boost::posix_time::time_duration td_1(1,30,0);
		TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_1.hours(),td_1.minutes(),td_1.seconds(),td_1.total_seconds());//小时1,分钟30,秒0,总秒:5400

		//时间点计算
		boost::posix_time::ptime pt11(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0)); 
		boost::posix_time::ptime pt12(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(18, 30, 0)); 
		boost::posix_time::time_duration td_2 = pt12 - pt11; 
		TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_2.hours(),td_2.minutes(),td_2.seconds(),td_2.total_seconds());//小时6,分钟30,秒0,总秒:23400
		boost::posix_time::time_duration td_3 = pt11 - pt12; 
		TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_3.hours(),td_3.minutes(),td_3.seconds(),td_3.total_seconds());//小时-6,分钟-30,秒0,总秒:-23400

		
		boost::posix_time::ptime pt13(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0)); 
		boost::posix_time::time_duration td_4(6, 30, 0); 
		boost::posix_time::ptime pt14 = pt13 + td_4; //ptime 与 time_duration 相加
		TRACE("小时%d,分钟%d,秒%d\n",pt14.time_of_day().hours(),pt14.time_of_day().minutes(),pt14.time_of_day().seconds());//小时18,分钟30,秒0


		{
			//时间区间,intersection 可以用于计算时间交集,merge 合并时间区
			boost::posix_time::ptime pt1(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0)); 
			boost::posix_time::ptime pt2(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(13, 30, 0)); 
			boost::posix_time::time_period tp(pt1, pt2); 
			TRACE("%d,%d\n",tp.contains(pt1),tp.contains(pt2));
		}

		{
			boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0)); 
			//迭代器,操作一次变动6.5个小时
			boost::posix_time::time_iterator it(pt, boost::posix_time::time_duration(6, 30, 0)); 
			++it;
			boost::posix_time::ptime pt1=*it;
			TRACE("小时%d,分钟%d,秒%d\n",pt1.time_of_day().hours(),pt1.time_of_day().minutes(),pt1.time_of_day().seconds());//小时18,分钟30,秒0
			++it;
			boost::posix_time::ptime pt2=*it;
			TRACE("小时%d,分钟%d,秒%d\n",pt2.time_of_day().hours(),pt2.time_of_day().minutes(),pt2.time_of_day().seconds());//小时1,分钟0,秒0
		}
	}
	catch (std::exception& e)
	{
		TRACE("%s\n",e.what());
	}

		{
			//CET Central European,+1 表示 CET时间比UTC时间早1小时
			boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+1")); 
			//定义一个时间点
			boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0)); 
			boost::local_time::local_date_time dt(pt, tz);
			TRACE("时区名称:%s\n",dt.zone_name().c_str());
			{
				boost::gregorian::date pd=dt.utc_time().date();
				boost::posix_time::time_duration td =dt.utc_time().time_of_day();
				TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
			}
			{
				boost::gregorian::date pd=dt.date();
				boost::posix_time::time_duration td =dt.time_of_day();
				TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
			}
			{
				boost::gregorian::date pd=dt.local_time().date();
				boost::posix_time::time_duration td =dt.local_time().time_of_day();
				TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时13,分钟0,秒0
			}
		}

		{
			boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+1")); 
			boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0)); 
			boost::local_time::local_date_time dt(pt, tz); 
			TRACE("时区名称:%s\n",dt.zone_name().c_str());
			{
				boost::gregorian::date pd=dt.local_time().date();
				boost::posix_time::time_duration td =dt.local_time().time_of_day();
				TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时13,分钟0,秒0
			}
			//EET,东部欧洲时间,比CET早两个小时
			boost::local_time::time_zone_ptr tz2(new boost::local_time::posix_time_zone("EET+2")); 
			{
				boost::gregorian::date pd=dt.local_time_in(tz2).date();
				boost::posix_time::time_duration td =dt.local_time_in(tz2).time_of_day();
				TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
			}
		}

		{
			boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+0")); 

			boost::posix_time::ptime pt1(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0)); 
			boost::local_time::local_date_time dt1(pt1, tz); 

			boost::posix_time::ptime pt2(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(18, 0, 0)); 
			boost::local_time::local_date_time dt2(pt2, tz); 

			boost::local_time::local_time_period tp(dt1, dt2); 
			TRACE("%d,%d\n",tp.contains(dt1) ,tp.contains(dt2));//1,0
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值