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秒
#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秒 

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

(0)

相关推荐

  • C++设置系统时间及系统时间网络更新的方法

    本文实例讲述了C++设置系统时间及系统时间网络更新的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: //根据返回的时间设置系统时间 void setTimeFromTP(ULONG ulTime) {      FILETIME ft;      SYSTEMTIME st;        //将基准时间转换成windows文件时间      st.wYear = 1900;      st.wMonth = 1;      st.wDay = 1;      st.wHo

  • C++实现当前时间动态显示的方法

    本文实例讲述了C++实现当前时间动态显示的方法.分享给大家供大家参考.具体如下: /* 24-06-10 10:44 动态显示时间 但不是最优的 功能很单一 本程序关键是对时钟函数的使用 **tm结构定义了 年.月.日.时.分.秒.星期.当年中的某一天.夏令时 **用localtime获取当前系统时间,该函数将一个time_t时间转换成tm结构表示的时间,函数原型: struct tm * localtime(const time_t *) **使用gmtime函数获取格林尼治时间,函数原型:

  • C++获取当前系统时间的方法总结

    本文实例讲述了C++获取当前系统时间的方法.分享给大家供大家参考.具体如下: 方案- 优点:仅使用C标准库:缺点:只能精确到秒级 #include <time.h> #include <stdio.h> int main( void ) { time_t t = time(0); char tmp[64]; strftime(tmp,sizeof(tmp),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t)); puts(

  • C++实现两个日期间差多少天的解决方法

    计算原理是先求出每个日期距离1年1月1日的天数差值,再进一步做差即可. 复制代码 代码如下: #include <stdio.h>struct MyDate{ int year; int month; int day;}; int GetAbsDays(MyDate x){ int i; int month_day[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int year = x.year-1;  // 因为欲求距离1年1月1日的距离 int da

  • VC++ 获取系统时间的方法汇总

    1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm.Format("现在时间是%Y年%m月%d日 %X"); MessageBox(str,NULL,MB_OK); a,从CTimet中提取年月日时分秒 CTime t = CTime::GetCurrentTime(); int d=t.GetDay(); //获得几号 int y=t.

  • C++时间戳转换成日期时间的步骤和示例代码

    因工作需要,经常跟时间戳打交道,但是因为它仅仅是一个数字,我们很难直接看出它有什么意义,或两个时间戳之间究竟差了多长的间隔.于是从MSDN for Visual Studio6上找到了时间戳转换成日期时间的算法.本文除介绍这一算法外,还提供一个示例代码. 1.将时间戳转换成一串32比特的二进制数.有些数字转换之后不够32位,则在前面补充0.这可通过windows自带的计算器完成.比如481522543转换成 0001 1100 1011 0011 0111 0011 0110 1111 2.根据

  • C++自定义函数判断某年某月某日是这一年中第几天

    本文实例讲述了C++自定义函数判断某年某月某日是这一年中第几天的方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * 完成日期:2012 年 11 月 30 日 * 版 本 号:v1.0 * * 输入描述: * 问题描述:编写函数判断某年某月某日这一年中是第几天,在主函数中调用该函数. * 程序输出: * 问题分析:略 * 算法设计:略 */ #include<iostream> using namespace std; int main() { void f(int yea

  • C++基于蔡基姆拉尔森计算公式实现由年月日确定周几的方法示例

    本文实例讲述了C++基于蔡基姆拉尔森计算公式实现由年月日确定周几的方法.分享给大家供大家参考,具体如下: #include <iostream> #include <string> using namespace std; int whatday(int y, int m, int d) { // 返回正确的星期.用 0 - 6 表示 星期 1 - 7 if(m==1||m==2) { y--; m+=12; } return(d+2*m+3*(m+1)/5+y+y/4-y/100

  • C++实现日期类(Date类)的方法

    如下所示: #include<iostream> using namespace std; class Date { public: Date(int year = 1900, int month = 1, int day = 1) //构造 :_year(year) , _month(month) , _day(day) { if (!isInvalidDate(_year, _month, _day)) { _year = 1900; _month = 1; _day = 1; } } D

  • C++取得当前时间的方法

    本文实例讲述了C++取得当前时间的方法,分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: //取本地时间  BOOL GetTime(string &mytime)  {      BOOL b_ret = TRUE;      CHAR szBuf1[256]={0};      CTime   tNow   =   CTime::GetCurrentTime();       sprintf(szBuf1,"%04u%02u%02u%02u%02u%02u"

  • C++中获取UTC时间精确到微秒的实现代码

    在日常开发过程中经常会使用到时间类函数的统计,其中获取1970年至今的UTC时间是比较常使用的,但是在windows下没有直接能够精确到微妙级的函数可用.本文提供方法正好可以解决这类需求问题. 下面先给出C++实现代码: 复制代码 代码如下: #ifndef UTC_TIME_STAMP_H_#define UTC_TIME_STAMP_H_ #include <windows.h>#include <sys/timeb.h>#include <time.h> #if

随机推荐