【Boost】date_duration与date_period

来源:互联网 时间:1970-01-01

date_duration与date_period以前没有特别关注, 常混淆.
date_duration: 日期差(日期间隔)
date_period: 日期段

通过下面的例子可以更好的理解:
[cpp] view plaincopyprint?

  1. void test_date_duration()  
  2. {  
  3.     using namespace boost::gregorian;  
  4.   
  5.     // 常见的几种构造方法  
  6.     {  
  7.         date_duration dd(3);  
  8.   
  9.         days dd1(neg_infin);  
  10.         days dd2(pos_infin);  
  11.         days dd3(not_a_date_time);  
  12.         days dd4(max_date_time);  
  13.         days dd5(min_date_time);  
  14.     }  
  15.   
  16.     // 简单运算  
  17.     {  
  18.         date_duration dd1(3);  
  19.         date_duration dd2(5);  
  20.         date_duration dd3 = dd1 + dd2;  
  21.         date_duration dd4 = dd1 - dd2;  
  22.         assert(dd3.days() == 8);  
  23.         assert(dd4.days() == -2);  
  24.     }  
  25.   
  26.     // years, months, days  
  27.     {  
  28.         years ysingle(1);  
  29.         date dy1 = date(2003, 2, 28) + ysingle;  
  30.         assert(dy1 == date(2004, 2, 29));  
  31.         date dy2 = date(2004, 2, 29) + ysingle;  
  32.         assert(dy2 == date(2005, 2, 28));  
  33.   
  34.         months msingle(1);  
  35.         date dm1 = date(2004, 1, 31) + msingle; // => 2004-Feb-29  
  36.         date dm2 = date(2005, 1, 31) + msingle; // => 2005-Feb-28  
  37.         assert(dm1 == date(2004, 2, 29));  
  38.         assert(dm2 == date(2005, 2, 28));  
  39.   
  40.         weeks wsingle(1);  
  41.         date dw1 = date(2005, 1, 1) + wsingle; // => 2005-Jan-08  
  42.         assert(dw1 == date(2005, 1, 8));  
  43.   
  44.         date_duration dd(3);  
  45.         assert(dd.days() == 3);  
  46.     }  
  47. }  

[cpp] view plaincopyprint?
  1. void test_date_period()  
  2. {  
  3.     using namespace boost::gregorian;  
  4.   
  5.     // 注意这样的构造函数是左闭右开  
  6.     date_period dp1(date(2010, 11, 29), date(2010, 12, 1));   
  7.     date_period dp2(date(2010, 11, 29), days(2));     
  8.     date_period dp3(dp2);  
  9.   
  10.     // 时间段向后平移3天(dp2 = 12.2-->12.4)  
  11.     dp2.shift(days(3));  
  12.     assert(dp2 == date_period(date(2010, 12, 2), date(2010, 12, 4)));  
  13.   
  14.     // 时间段向前后各扩展1天(dp3 = 11.28-->12.2)  
  15.     dp3.expand(days(1));  
  16.     assert(dp3 == date_period(date(2010, 11, 28), date(2010, 12, 2)));  
  17.   
  18.     // begin, end, last  
  19.     assert(dp1.begin() == date(2010, 11, 29));  
  20.     // 注意end, last的区别。 last是最后一天, end是时间段的右边界(不包含)  
  21.     assert(dp1.end() == date(2010, 12, 1));  
  22.     assert(dp1.last() == date(2010, 11, 30));  
  23.       
  24.     // 时间段的长度  
  25.     // assert(dp1.length() == 2);  
  26.   
  27.     // 一些判断函数(返回值是bool)  
  28.     assert(!dp1.is_null()); // 当起始时间大于结束时间  
  29.     assert(!dp1.contains(date(2010, 12, 1)));   // 也可以包含时间段   
  30.     bool b1 = dp3.intersects(dp1);  // 除了包含时间点之外, 还可以包含时间段交叉的运算  
  31.     assert(b1 == true);  
  32.     bool b2 = dp3.intersects(dp2);  
  33.     assert(b2 == false);  
  34.     // intersection与intersects不同在于: 它的返回值上date_period  
  35.     date_period dp4(date(2010, 11, 30), date(2010, 12, 3));   
  36.     dp4 = dp4.intersection(dp1);  
  37.     assert(dp4.begin() == date(2010, 11, 30));  
  38.     assert(dp4.end() == date(2010, 12, 1));  
  39.   
  40.     // is_adjacent判断时间段是否相邻. 不能重叠.  
  41.     date_period dp5(date(2010, 12, 1), date(2010, 12, 5));  
  42.     bool b3 = dp1.is_adjacent(dp5);  
  43.     assert(b3);  
  44.   
  45.     // is_before, is_after  
  46.     date d1(2010, 12, 1);  
  47.     bool b4 = dp1.is_before(d1);  
  48.     assert(b4);  
  49.     d1 = d1 - days(1);  
  50.     bool b5 = dp1.is_before(d1);  
  51.     assert(!b5);  
  52.   
  53.     // 时间段合并(merge), 两个没有重合(包括相邻)的时间段, 结果为空.  
  54.     date_period dp6 = dp1.merge(dp3);  
  55.     assert(dp6 == date_period(date(2010, 11, 28), date(2010, 12, 2)));  
  56.   
  57.     // 时间段合并(span)  
  58.     // begin = min(p1.begin, p2.begin)  
  59.     // end = max(p1.end , p2.end)  
  60.     date_period dp7(date(2010, 12 ,1), date(2010, 12, 5));  
  61.     date_period dp8(date(2010, 12 ,9), date(2010, 12, 31));  
  62.     date_period dp9 = dp7.span(dp8); // 2002-Jan-01/2002-Jan-31  
  63.     assert(dp9 == date_period(date(2010, 12 ,1), date(2010, 12, 31)));  
  64.     // 输出: [2010-Dec-01/2010-Dec-30]  
  65.     std::cout << dp9 << std::endl;  
  66. }  

上文来自:http://blog.csdn.net/huang_xw/article/details/8239518



相关阅读:
Top