zoukankan      html  css  js  c++  java
  • boost 时间与日期处理

    博客转载自:

    特点
    缺点
    说明
    timer
    计时基类
    不适合大跨度时间
    适用大部分的普通计时
    progress_timer
    继承自timer 可以自动写入流中
    只精确到0.01s
    如果需要更精确,可派生个类,调用stream的precision设置
    progress_display 图形化显示进度 只能输出到cout 如果还有其他输出则会干扰进度显示。
    折中的办法是重新显示 pd.restart(size); pd+= pNum;
    date 日期结构,时间点 —— date是date_time库的核心类 boost::gregorian
    date_duration days、months、years 时间段 —— 表示一段时间,可以把它看成一个int
    date_period 标量,左开右闭,时间区间 —— 可以认为是一个有起点的date_duration。能做交集、并集
    date_iterator 迭代器,以某个单位增减 —— 天、周、月、年四种迭代器,以某种增量移动。
    time_duration 时间段 同date_duration —— hours、minutes、seconds、millisec、boost::posix_time
    ptime 时间点 date+time_duration —— 分date()和time_of_day()操作。
    time_period 时间区间 同date_period —— ——
    time_iterator 迭代器,以某个单位增减 —— 可直接与ptime比较
    date_facet 流格式化日期 —— %Y年%m月%d日
    time_facet 流格式化时间 —— %Y年%m月%d日 %H点%M分%S%F秒

     

    #include <boost/timer.hpp>
    #include <boost/progress.hpp>
    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <Windows.h>
    
    #include <boost/date_time/gregorian/gregorian.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    using namespace std;
    
    int main()
    {
    	boost::timer t;
    	std::cout<<"Max "<<t.elapsed_max()<<endl;
    	std::cout<<"Min "<<t.elapsed_min()<<endl;
    	std::cout<<"elapsed: "<<t.elapsed()<<endl;
    	t.restart();
    	Sleep(100);
    	std::cout<<"elapsed: "<<t.elapsed()<<endl; 
    	cout<<"---------------------------"<<endl;
    	stringstream ss;
    	{
    		boost::progress_timer t(ss); 
    		Sleep(300);
    	}
    	cout<<ss.str();
    	cout<<"---------------------------"<<endl;
    
    	vector<string> v(100);
    	//Do Data Fill...... 
    	ofstream fs("c:	est.txt");
    
    	boost::progress_display pd(v.size());
    	vector<string>::iterator pos;
    	for (pos = v.begin();pos != v.end();++pos)
    	{
    		fs<<*pos<<endl;
    		Sleep(10);
    		++pd;
    		//pd.restart(v.size());
    		//pd+=(pos-v.begin() +1);
    	}
    	cout<<"---------------------------"<<endl;
    	
    	{
    		using namespace boost::gregorian;
    		cout<<"-----------------  date ------------------"<<endl;
    		date d1;
    		date d2(2013,4,7);
    		date d3(2013,Apr,7);
    		date d4(d2);
    
    		assert(d1 == date(not_a_date_time)); //默认初始化为无效日期
    		assert(d2 == d4);
    		assert(d3 == d2);
    		
    		d1 = from_string("1999,9,9");
    		date d5 (from_string("2008/8/8"));
    		d3 = from_undelimited_string("20110111");
    		
    		cout<<day_clock::local_day()<<endl;
    		cout<<day_clock::universal_day()<<endl;
    
    		date d6 (neg_infin);
    		date d7(pos_infin);
    		cout<<d6<<endl;
    		cout<<d7<<endl;
    
    		cout<<"---------------------------"<<endl;
    		date today (2013,4,17);
    		assert(today.year() == 2013);
    		assert(today.month() == 4);
    		assert(today.day() == 17);
    
    		date::ymd_type ymd = today.year_month_day();
    		assert(ymd.year == 2013);
    		assert(ymd.month == 4);
    		assert(ymd.day == 17);
    
    		assert(today.day_of_week() == 3); //星期几 周日为0
    		cout<<today.day_of_year()<<endl;	//在一年中是第几天
    		assert(today.end_of_month() == date(2013,4,30));	//当月的最后一天
    		cout<<today.week_number()<<endl;	//当年的第几周 范围0~53 年初的半周归为上一年,即53
    		assert(d6.is_infinity());			//日期为无限日期
    		assert(d6.is_neg_infinity());
    		cout<<"---------------------------"<<endl;
    
    		cout<<to_simple_string(today)<<endl;
    		cout<<to_iso_string(today)<<endl;		
    		cout<<to_iso_extended_string(today)<<endl;	//常用日期格式YYYY-MM-DD
    		cout<<today<<endl;
    	
    		cout<<"---------------------------"<<endl;
    		tm t = to_tm(today);	
    		assert(t.tm_hour == 0 && t.tm_min == 0);
    		
    		date new_today = date_from_tm(t);	//从tm转为date
    		assert(new_today == today);
    
    		cout<<"-------------- days(date_duration) --------------"<<endl;
    		days dd1(10),dd2(-20),dd3(365);
    		assert(dd1>dd2 &&dd1<dd3);
    		assert(dd1+dd2 == days(-10));
    		assert((dd2+dd3).days() == 345);
    		assert(dd3/5 == days(73));
    
    		weeks w(3);		//3个星期
    		assert(w.days() == 21);
    		
    		months m(5);
    		years y(2);
    
    		months m2 = y+m;
    		assert(m2.number_of_months() == 29);
    		assert((y*2).number_of_years() == 4);
    
    		cout<<"-------------- Calc --------------"<<endl;
    		date dA(2000,1,1),dB(2008,8,8);
    		cout<<dB-dA<<endl;		//3142天
    		
    		dA+=days(10);
    		assert(dA.day() == 11);
    		dA+=months(2);
    		assert(dA.month() ==3 && dA.day()== 11);
    
    		dA-=weeks(1);
    		assert(dA.day() == 4);
    
    		dB-=years(7);
    		assert(dA.year() == dB.year()-1);
    
    		//如果日期是月末的最后一天,加减月或年会得到月末的时间,而不是简单的月、年加1
    		date sp(2013,3,30);
    		sp-=months(1);
    		assert(sp.month() == 2 && sp.day() == 28);
    		sp -=months(1);
    		assert(sp.month()== 1 && sp.day()== 31);
    		sp+=months(2);
    		assert(sp.day() == 31); //与原来的日期已经不相等!
    
    		cout<<"-------------- date_period --------------"<<endl;
    		date_period dp(date(2013,4,17),days(14));	//左开右闭与STL的容器相似
    		assert(!dp.is_null());
    		assert(dp.begin().day() == 17);
    		assert(dp.last().day() == 30);
    		assert(dp.end().day() == 1);
    
    		cout<<dp<<endl;
    
    		date_period new_dp = dp;
    		new_dp.shift(days(3));		//将时间区间向后移动
    		assert(new_dp.begin().day() == 20);
    		assert(new_dp.length().days() == 14);
    
    		
    		new_dp.expand(days(3));		//区间两段延长n天,即延长2n天。
    		assert(new_dp.begin().day() == 17);
    		assert(new_dp.length().days() == 20);
    
    		assert(dp.is_after(date(2013,1,1)));
    		assert(dp.contains(date(2013,4,20)));
    
    		date_period dp2 (date(2013,4,17),days(5));
    		assert(dp.contains(dp2));
    		
    		assert(dp.intersects(dp2));		//交集
    		assert(dp.intersection(dp2) == dp2);
    		
    		date_period dp3 (date(2013,5,1),days(5));
    		assert(!dp3.intersects(dp));
    		assert(dp3.intersection(dp2).is_null());
    
    		assert(dp.is_adjacent(dp3));
    		
    		date_period dp4(date(2013,4,17),days(19)); //并集
    		assert(dp.merge(dp3).is_null());	//无交集返回空
    		assert(dp.span(dp3) == dp4);		//填充中间区域
    
    
    		cout<<"-------------- date_iterator --------------"<<endl;
    		date last(2013,4,17);
    
    		day_iterator d_iter(last);	//日期迭代器
    
    		assert(d_iter == last);
    		++d_iter;
    		assert(d_iter == date(2013,4,18));
    
    		year_iterator y_iter(*d_iter,3);	//增减步长为3
    		assert(y_iter == last + days(1));
    
    		++y_iter;
    		assert(y_iter->year() == 2016);
    	
    		cout<<"-------------- func --------------"<<endl;
    		cout<<(gregorian_calendar::is_leap_year(2000)? "Yes":"no")<<endl;	//闰年
    		assert(gregorian_calendar::end_of_month_day(2013,2) == 28);		//月末天
    		
    	}
    	
    	{
    		using namespace boost::posix_time;
    		cout<<"-------------- time_duration --------------"<<endl;
    		time_duration td(1,1,1);	//时、分、秒 会自动借、进位
    		hours h0(1);
    		minutes m(1);
    		seconds s(1);
    		millisec ms(1);
    		
    		time_duration td2 = h0+m+s+ms;
    		time_duration td3 = hours(2) + minutes(10);
    		time_duration td4 = duration_from_string("1:10:10:300");
    
    		assert(td4.hours() == 1 && td4.minutes() == 10 && td4.seconds() == 10);	
    		assert(td.total_seconds() == 1*3600 + 1*60 +1);	//转为sec
    
    		hours h(-10);
    		assert(h.is_negative());
    
    		time_duration h2 = h.invert_sign();	//取反
    		assert(!h2.is_negative() && h2.hours() == 10);
    
    		cout<<td3-td2<<endl;
    		cout<<to_simple_string(td4)<<endl;
    		cout<<to_iso_string(td4)<<endl;
    		
    		cout<<"-------------- ptime --------------"<<endl;
    		{
    			using namespace boost::gregorian;
    			ptime p(date(2013,4,17),hours(1));	//ptime相当于date+time_duration
    			ptime p1 = time_from_string("2013-4-17 16:25:00");
    			cout<<p<<endl;
    			cout<<p1<<endl;
    			ptime p2 = second_clock::local_time();			//常用时间输出
    			ptime p3 = microsec_clock::universal_time();	//微秒精度
    			cout<<p2<<endl<<p3<<endl;
    
    			ptime op(date(2013,4,17),hours(1)+minutes(30));
    
    			date d = op.date();
    			time_duration optd = op.time_of_day();
    			assert(d.day() == 17 && d.month() == 4);
    			assert(optd.hours() == 1 && optd.minutes() == 30);
    			cout<<to_iso_extended_string(op)<<endl;
    
    			tm t = to_tm(op);	//不可逆,此处与date不同
    								//只能用date_from_tm先得到日期,再填充时间。
    			
    			cout<<"-------------- time_period --------------"<<endl;
    			time_period tp1 (op,hours(8));
    			time_period tp2(op+hours(8),hours(1));
    			assert(tp1.end() == tp2.begin() && tp1.is_adjacent(tp2));
    			assert(!tp1.intersects(tp2));
    
    			tp1.shift(hours(1));
    			assert(tp1.is_after(op));
    			assert(tp1.intersects(tp2));
    
    			tp2.expand(hours(10));
    			assert(tp2.contains(op) && tp2.contains(tp1));
    
    			cout<<"-------------- time_iterator --------------"<<endl;
    			for (time_iterator t_iter(op,minutes(10));t_iter<op+hours(1);++t_iter)
    			{
    				cout<<*t_iter<<endl;
    			}
    			cout<<"-------------- formate --------------"<<endl;
    			date_facet* dfacet = new date_facet("%Y 年%m 月%d 日");
    			cout.imbue(locale(cout.getloc(),dfacet));
    			cout<<date(2013,4,17)<<endl;
    
    			time_facet* tfacet = new time_facet("%Y 年%m 月%d 日 %H点%M分%S%F秒");
    			cout.imbue(locale(cout.getloc(),tfacet));
    			cout<<op<<endl;
    		}
    	}
    
    	getchar();
    	return 0;
    }
    

      

    运行结果:

    Max 2.14748e+006
    Min 0.001
    elapsed: 0.001
    elapsed: 0.1
    ---------------------------
    0.30 s
    ---------------------------
    0% 10 20 30 40 50 60 70 80 90 100%
    |----|----|----|----|----|----|----|----|----|----|
    ***************************************************
    ---------------------------
    ----------------- date ------------------
    2013-Apr-17
    2013-Apr-17
    -infinity
    +infinity
    ---------------------------
    107
    16
    ---------------------------
    2013-Apr-17
    20130417
    2013-04-17
    2013-Apr-17
    ---------------------------
    -------------- days(date_duration) --------------
    -------------- Calc --------------
    3142
    -------------- date_period --------------
    [2013-Apr-17/2013-Apr-30]
    -------------- date_iterator --------------
    -------------- func --------------
    Yes
    -------------- time_duration --------------
    01:08:58.999000
    01:10:10.300000
    011010.300000
    -------------- ptime --------------
    2013-Apr-17 01:00:00
    2013-Apr-17 16:25:00
    2013-Apr-17 17:19:21
    2013-Apr-17 09:19:21.870604
    2013-04-17T01:30:00
    -------------- time_period --------------
    -------------- time_iterator --------------
    2013-Apr-17 01:30:00
    2013-Apr-17 01:40:00
    2013-Apr-17 01:50:00
    2013-Apr-17 02:00:00
    2013-Apr-17 02:10:00
    2013-Apr-17 02:20:00
    -------------- formate --------------
    2013 年04 月17 日
    2013 年04 月17 日 01点30分00秒
  • 相关阅读:
    Java面向对象(02)--封装
    Java面向对象(01)--初识
    Java基础(10)--数组
    Java基础(09)--方法
    python中format输出常用的3种格式
    python 查找列表中重复元素以及重复元素的次数
    HttpRunner六:创建run.py文件,执行套件并生成测试报告
    HttpRunner五:关联参数的应用,获取上一个接口的返回值,用于当前接口的请求值
    HttpRunner四:testcases、testsuites以及参数化的使用
    HttpRunner中在case2中,使用作为请求参数和预期结果,预期结果中值显示是:LazyString($变量key)
  • 原文地址:https://www.cnblogs.com/flyinggod/p/9082351.html
Copyright © 2011-2022 走看看