boost 时间与日期处理
博客转载自:
|
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:\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; } |
运行结果:
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秒
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版