您的位置:首页 > 其它

boost 时间与日期处理

2017-04-06 14:30 369 查看
【Boost】time_duration, time_period, time_iterator

time_duration的例子

[cpp] view
plain copy

print?

void test_ptime_duration()

{

using namespace boost::posix_time;

using namespace boost::gregorian;

// time_duration构造的常用方法

time_duration td1(1, 2, 3, 4);

time_duration td2 = time_duration(1, 2, 3) + milliseconds(4) + microseconds(5);

time_duration td3 = hours(1) + minutes(2) + seconds(3) + milliseconds(4) + microseconds(5);

time_duration td4(duration_from_string("01:02:03.000"));

// 计算总共的秒数, 毫秒数, 微秒数.

std::cout << td1.total_seconds() << std::endl;

std::cout << td1.total_milliseconds() << std::endl;

std::cout << td1.total_microseconds() << std::endl;

}

time_period的例子

[cpp] view
plain copy

print?

void test_ptime_period()

{

using namespace boost::posix_time;

using namespace boost::gregorian;

// time_period构造的常用方法, 注意这样的构造函数是左闭右开, 如果end <= begin則时间段定义为无效.

time_period tp1(ptime(date(2010, 11, 29), hours(11) + minutes(23) + seconds(45)),

ptime(date(2010, 12, 10), hours(22) + minutes(45) + seconds(56) + milliseconds(10)));

time_period tp2(ptime(date(2010, 11, 29), hours(11) + minutes(23) + seconds(45)),

time_duration(2, 3, 4, 5));

time_period tp3(tp2);

std::cout << tp1 << std::endl;

std::cout << tp2 << std::endl;

// shift, expand

time_period tp5(tp2);

tp5.shift(time_duration(1, 2, 3, 4));

time_period tp6(tp2);

tp6.expand(time_duration(2, 3, 4, 5));

std::cout << tp5 << std::endl;

std::cout << tp6 << std::endl;

// begin, last, end

ptime pt1 = tp2.begin();

ptime pt2 = tp2.end();

ptime pt3 = tp2.last();

std::cout << pt1 << std::endl;

std::cout << pt2 << std::endl;

std::cout << pt3 << std::endl;

// length, merge, span, intersects, intersection

// 同date, 参见: http://blog.csdn.net/huang_xw/article/details/8239518
}

time_iterator的例子

[cpp] view
plain copy

print?

void test_ptime_iterator()

{

using namespace boost::gregorian;

using namespace boost::posix_time;

date d(2012, 11, 30);

ptime start(d);

ptime end = start + hours(1);

// 每次递增15分钟

time_iterator titr(start, minutes(15));

// 生成 00:00:00, 00:15:00, 00:30:00, 00:45:00

while (titr < end) {

std::cout << to_simple_string(*titr) << std::endl;

++titr;

}

}

2017-01-19 09:48 38人阅读 评论(0) 收藏 举报

特点缺点说明
timer计时基类不适合大跨度时间适用大部分的普通计时
progress_timer继承自timer 可以自动写入流中只精确到0.01s如果需要更精确,可派生个类,调用stream的precision设置
progress_display图形化显示进度只能输出到cout如果还有其他输出则会干扰进度显示。

折中的办法是重新显示 pd.restart(size); pd+= pNum;
date日期结构,时间点——date是date_time库的核心类 boost::gregorian
date_durationdays、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秒
[cpp] view
plain copy







#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:\test.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;

}

运行结果:

[cpp] view plain copy

print?





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秒

[Boost]boost的时间和日期处理-(1)日期的操作

本篇紧接着boost上篇叙述Boost::DateTime的时间处理。在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime。

构造ptime

1.ptime的构造函数有四种:

1:      using namespace boost::posix_time;


2:      using namespace boost::gregorian;

3:  ptime pt(date(2013,Jan,24),time_duration(1,2,3)); //由date和time_duration构造

4:  ptime pt1(date(2013,Jan,24),hours()+nanosec(5));//改变形式的time_duration也能使用

5:ptime pt2(p1);//拷贝构造函数

6:ptime pt3(neg_infin);//特殊值构造

7:  ptime p;//默认构造函数,这里p等于not_a_date_time


2.用string构造ptime:

1:      std::string ts1("2013-01-30 23:32:22.000");//固定格式,小数点后支持6位

2:  ptime pt1(time_from_string(ts1));

3:  std::string ts2("20130130T233222");//没有分隔符的date和time

4:  ptime pt2(from_iso_string(ts2));

5:


3.通过时钟构造ptime:

1:      ptime ct1(second_clock::local_time());

2:  ptime ct2(second_clock::universal_time());

3:  ptime ct3(microsec_clock::local_time());

4:  ptime ct4(microsec_clock::universal_time());

5:


4.time_t和FILETIME构造ptime:

1:      ptime t = from_time_t(tt); // 其中tt为time_t

2:  ptime t1 = from_ftime<ptime>(ft); //其中ft为FILETIME


ptime访问日期时间

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:  ptime now(second_clock::local_time());

4:  std::cout << "today is: " << now.date() << std::endl;

5:std::cout << "time is: " << now.time_of_day() << std::endl;

6:


ptime转换为string

1:      std::string now_str(to_simple_string(now));

2:  std::string now_iso_str(to_iso_string(now));

3:  std::string now_iso_ext_str(to_iso_extended_string(now));

4:  std::cout << now_str << std::endl;

5:std::cout << now_iso_str << std::endl;

6:std::cout << now_iso_ext_str << std::endl;


ptime与tm,time_t,FILETIME互转

1.tm

1:     using namespace boost::posix_time;

2:     using namespace boost::gregorian;

3:     tm pt_tm;

4:     pt_tm.tm_year = 113;

 5: pt_tm.tm_mon = 11;

 6: pt_tm.tm_mday = 25;

7:     pt_tm.tm_hour = 2;

8:     pt_tm.tm_min = 23;

9:     pt_tm.tm_sec = 40;

10:

11: ptime pt = data_from_tm(pt_tm);

12:     std::cout << pt << std::endl;

13:

14:     pt = pt + hours(2);

15: tm pt_tm1 = to_tm(pt);


2. time_t

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:

4:  time_t now = time(NULL);

 5:std::cout << "time_t : " << now << std::endl;

 6:ptime now_pt = from_time_t(now);

7:  std::cout << "ptime from time_t : " << now_pt.time_of_day() << std::endl;

8:  tm* now_tm = gmtime(&now);

9:  std::cout << "tm struct: hour : " << now_tm->tm_hour << std::endl;

10:


3.FILETIME

1:      FILETIME ft;

2:  ft.dwHighDateTime = 29715317;

3:  ft.dwLowDateTime = 3865122988UL

4:      ptime pt = from_ftime<ptime>(ft);

5:// pt ===> 2005-Jun-07 15:30:57.03958200

6:


time_duration和time_period

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:

4:  time_duration td(100,200,3,9);

 5:std::cout << td << std::endl;

 6:date d(2013,Feb,5);

7:  ptime pt(d,minutes(10));

8:  ptime pt1(d,hours(10));

9:  time_period tp(pt,pt1);

10:std::cout << tp << std::endl;

11:


对于这两者的区别,一个是时间间隔,一个是时间起止的一个窗口。time_duration用于ptime的时间偏移计算为主。而time_period可以计算一个ptime时间点是否在这个时间区间内(参考contains函数)。time_period在创建之后可以扩展,可以平移,函数分别为expand和shift。请大家自己细究。
[Boost]boost的时间和日期处理-(2)时间的操作

本篇紧接着boost上篇叙述Boost::DateTime的时间处理。在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime。

构造ptime

1.ptime的构造函数有四种:

1:      using namespace boost::posix_time;


2:      using namespace boost::gregorian;

3:  ptime pt(date(2013,Jan,24),time_duration(1,2,3)); //由date和time_duration构造

4:  ptime pt1(date(2013,Jan,24),hours()+nanosec(5));//改变形式的time_duration也能使用

5:ptime pt2(p1);//拷贝构造函数

6:ptime pt3(neg_infin);//特殊值构造

7:  ptime p;//默认构造函数,这里p等于not_a_date_time


2.用string构造ptime:

1:      std::string ts1("2013-01-30 23:32:22.000");//固定格式,小数点后支持6位

2:  ptime pt1(time_from_string(ts1));

3:  std::string ts2("20130130T233222");//没有分隔符的date和time

4:  ptime pt2(from_iso_string(ts2));

5:


3.通过时钟构造ptime:

1:      ptime ct1(second_clock::local_time());

2:  ptime ct2(second_clock::universal_time());

3:  ptime ct3(microsec_clock::local_time());

4:  ptime ct4(microsec_clock::universal_time());

5:


4.time_t和FILETIME构造ptime:

1:      ptime t = from_time_t(tt); // 其中tt为time_t

2:  ptime t1 = from_ftime<ptime>(ft); //其中ft为FILETIME


ptime访问日期时间

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:  ptime now(second_clock::local_time());

4:  std::cout << "today is: " << now.date() << std::endl;

5:std::cout << "time is: " << now.time_of_day() << std::endl;

6:


ptime转换为string

1:      std::string now_str(to_simple_string(now));

2:  std::string now_iso_str(to_iso_string(now));

3:  std::string now_iso_ext_str(to_iso_extended_string(now));

4:  std::cout << now_str << std::endl;

5:std::cout << now_iso_str << std::endl;

6:std::cout << now_iso_ext_str << std::endl;


ptime与tm,time_t,FILETIME互转

1.tm

1:     using namespace boost::posix_time;

2:     using namespace boost::gregorian;

3:     tm pt_tm;

4:     pt_tm.tm_year = 113;

 5: pt_tm.tm_mon = 11;

 6: pt_tm.tm_mday = 25;

7:     pt_tm.tm_hour = 2;

8:     pt_tm.tm_min = 23;

9:     pt_tm.tm_sec = 40;

10:

11: ptime pt = data_from_tm(pt_tm);

12:     std::cout << pt << std::endl;

13:

14:     pt = pt + hours(2);

15: tm pt_tm1 = to_tm(pt);


2. time_t

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:

4:  time_t now = time(NULL);

 5:std::cout << "time_t : " << now << std::endl;

 6:ptime now_pt = from_time_t(now);

7:  std::cout << "ptime from time_t : " << now_pt.time_of_day() << std::endl;

8:  tm* now_tm = gmtime(&now);

9:  std::cout << "tm struct: hour : " << now_tm->tm_hour << std::endl;

10:


3.FILETIME

1:      FILETIME ft;

2:  ft.dwHighDateTime = 29715317;

3:  ft.dwLowDateTime = 3865122988UL

4:      ptime pt = from_ftime<ptime>(ft);

5:// pt ===> 2005-Jun-07 15:30:57.03958200

6:


time_duration和time_period

1:      using namespace boost::posix_time;

2:      using namespace boost::gregorian;

3:

4:  time_duration td(100,200,3,9);

 5:std::cout << td << std::endl;

 6:date d(2013,Feb,5);

7:  ptime pt(d,minutes(10));

8:  ptime pt1(d,hours(10));

9:  time_period tp(pt,pt1);

10:std::cout << tp << std::endl;

11:


对于这两者的区别,一个是时间间隔,一个是时间起止的一个窗口。time_duration用于ptime的时间偏移计算为主。而time_period可以计算一个ptime时间点是否在这个时间区间内(参考contains函数)。time_period在创建之后可以扩展,可以平移,函数分别为expand和shift。请大家自己细究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: