服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ boost 时间与日期处理详细介绍

C++ boost 时间与日期处理详细介绍

2021-04-20 15:30松阳 C/C++

这篇文章主要介绍了C++ boost 时间与日期处理详细介绍的相关资料,这里提供实例代码,及实现效果,需要的朋友可以参考下

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秒
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#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;
}
运行结果:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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秒

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/fansongy/article/details/8814996

延伸 · 阅读

精彩推荐