You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
4.6 KiB

  1. 
  2. //#define DATE_TIME_NO_DEFAULT_CONSTRUCTOR //不希望出现无效时间
  3. #include <boost/timer.hpp>
  4. #include <boost/progress.hpp>
  5. #include <iostream>
  6. #include <boost/date_time/gregorian/gregorian.hpp>
  7. #include <boost/date_time/posix_time/posix_time.hpp>
  8. using namespace std;
  9. using namespace boost;
  10. using namespace boost::gregorian;
  11. using namespace boost::posix_time;
  12. //自定义字面值 c11 新增了重载operator""的特性
  13. days operator"" _D(unsigned long long n)
  14. {
  15. return days(n);
  16. }
  17. weeks operator"" _W(unsigned long long n) {
  18. return weeks(n);
  19. }
  20. date operator"" _YMD(const char* s, std::size_t) {
  21. return from_string(s);
  22. }
  23. int main()
  24. {
  25. timer t; //计时器
  26. cout << "max timespan:" << t.elapsed_max() / 3600 << "h" << endl; // 可度量的最大时间
  27. cout << "min timespan:" << t.elapsed_min() << "s" << endl; //最小时间
  28. cout << "now time elapsed:" << t.elapsed() << "s" << endl; //流逝的时间
  29. progress_timer t2; //析构时会打印流逝时间elapsed()
  30. // progress_timer t3 = t2; //继承自noncopyable 不行
  31. // progress_timer t3(t2); //继承自noncopyable 不行
  32. /******************************DATE*******************************/
  33. gregorian::date d(2021,7,11);
  34. d = day_clock::local_day(); //当前时间
  35. gregorian::date d2 = from_string("2021-7-11");
  36. //d = from_undelimited_string("20210711");
  37. cout << to_iso_extended_string(d) << endl; // 日期以指定格式打印
  38. cout << to_iso_string(d) << endl;
  39. cout << to_simple_string(d) << endl;
  40. if (d > d2) { //支持比较操作符
  41. cout << "1111" << endl;
  42. }
  43. int inweek = d.day_of_week();
  44. cout << inweek << endl; //星期几
  45. int numInYear = d.day_of_year();
  46. cout << numInYear << endl; //一年中的第几天
  47. // 与C结构 tm 相互转换
  48. tm _tm = to_tm(d);
  49. date_from_tm(_tm);
  50. /******************************DATE END*******************************/
  51. //日期计算
  52. days day(1); //1天
  53. weeks week(1); //1个星期
  54. months mon(1); //1个月
  55. years year(1); //1年
  56. d += day ;
  57. d += week;
  58. d += mon;
  59. d += year;
  60. cout << to_iso_extended_string(d) << endl;
  61. //
  62. date ddd(2021, 3, 30);
  63. ddd -= months(1); //20210228 //注意 这里得到的是月末
  64. //日期区间 左闭右开区间
  65. date_period dp(d, days(20));
  66. if (dp.contains(d + days(2))) //是否包含 is_before is_after 在前在后、
  67. cout << 111 << endl;
  68. //还有交集、并集等 不常用就不一一讲了
  69. //日期迭代器 好像没啥用。。。
  70. //day_iterator iter(d);
  71. /******************************TIME*******************************/
  72. posix_time::time_duration time(1,10,30,1000);//时、分、秒、微秒
  73. cout << time << endl;
  74. hours houre(1);
  75. minutes min(10);
  76. seconds sec(59);
  77. millisec ms(1000);
  78. time_duration time2 = houre + min + sec + ms;
  79. cout << to_simple_string(time2) << endl; //以指定格式打印
  80. //与 date类似也可以用于比较
  81. //转换到tm
  82. _tm = to_tm(time2); //但是不能反向转换
  83. //默认精确度到微秒,纳秒相关的类函数默认都不可用!! 纳秒用得也不多,就不讨论了。。
  84. /******************************TIME END*******************************/
  85. /******************************DATE_TIME*******************************/
  86. ptime _ptime(d, time); //同时包含 日期和时间的结构
  87. ptime p1 = time_from_string("2021-7-12 01:00:00");
  88. ptime p2 = from_iso_string("20210712T020000");
  89. ptime p3 = second_clock::local_time(); //精确到秒
  90. ptime p4 = second_clock::universal_time(); //精确到微秒
  91. //操作ptime 可以分解为 date time 来处理
  92. //也支持加减处理
  93. p3 += hours(3);
  94. cout << to_simple_string(p3) << endl;
  95. cout << to_iso_string(p3) << endl;
  96. cout << to_iso_extended_string(p3) << endl; //源码是以T为分隔,可以自己改为空格
  97. //转为c结构:
  98. _tm = to_tm(p3);
  99. ptime_from_tm(_tm);
  100. ptime p5 = from_time_t(std::time(0));
  101. std::time_t time_t = to_time_t(p5);
  102. //时间区间 time_period //类似于 date_period 不在细说了
  103. /******************************DATE_TIME_END*******************************/
  104. days d11 = 11_D; //这个用来装逼还挺有一套,基础撇点的都不知道,哈哈
  105. weeks w3 = 3_W;
  106. date d20110712 = "2021-7-12"_YMD;
  107. //格式化时间
  108. //这个玩意儿 继承自std::locale::facet 是个智能指针,当引用计数为0 就会自动delete掉 。 所以当创在栈上,或创在堆上手动delete都会飞掉!注意了!
  109. date_facet *facet = new date_facet("%Y年%m月%d日");
  110. cout.imbue(locale(cout.getloc(),facet));
  111. cout << d20110712 << endl;
  112. time_facet* tfacet = new time_facet("%Y年%m月%d日 %H点%M分%S%F秒");
  113. cout.imbue(locale(cout.getloc(), tfacet));
  114. cout << p4 << endl;
  115. return 0;
  116. }