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

2025-05-27 0 72

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秒

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++ boost 时间与日期处理详细介绍 https://www.kuaiidc.com/74670.html

相关文章

发表评论
暂无评论