时间日期头文件包含
#include <boost/date_time/gregorian/gregorian.hpp>
try
{
//boost::gregorian::date 的缺省构造函数会创建一个无效的日期
boost::gregorian::date d(2017,12,23);
TRACE("%d年%d月%d日,周%d,月结日%d\n",d.year(),d.month(),d.day(),d.day_of_week(),d.end_of_month().day());
//当前时间日期
boost::gregorian::date d2=boost::gregorian::day_clock::universal_day();
TRACE("%d年%d月%d日,周%d,月结日%d\n",d2.year(),d2.month(),d2.day(),d2.day_of_week(),d2.end_of_month().day());
//通过字符串构造
boost::gregorian::date d3=boost::gregorian::date_from_iso_string("20171123");
TRACE("%d年%d月%d日,周%d,月结日%d\n",d3.year(),d3.month(),d3.day(),d3.day_of_week(),d3.end_of_month().day());
//返回时间区间,天数
boost::gregorian::date_duration dd=d3-d2;
TRACE("时间天数%d\n",dd.days());
//构造8个星期
boost::gregorian::weeks wk(8);
TRACE("%d\n",wk.days());//打印出 56
//构造8个月的时间
boost::gregorian::months mt(8);
TRACE("%d\n",mt.number_of_months());//打印8
//构造3年的时间
boost::gregorian::years yr(3);
TRACE("%d\n",yr.number_of_years());//打印3
//当前日期 与 moths 相加,每次计算以月份的实际天数计算
//当前日期 与 moths 相减,每次计算以月份的实际天数计算
//如果您不想这样子计算,可以取消 BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES 的定义,取消后不能
//boost::gregorian::weeks, boost::gregorian::months ,boost::gregorian::years和boost::gregorian::weeks都不能使用
boost::gregorian::months mt_calc(1);
boost::gregorian::date d_calc(2017,1,31);//以1月最后一日演示
boost::gregorian::date d4=d_calc+mt_calc;
TRACE("%d年%d月%d日\n",d4.year(),d4.month(),d4.day());//2017 02 28,20170131+1个月的时间表示递增到下一个月的结束日
boost::gregorian::date d5=d4-mt_calc;
TRACE("%d年%d月%d日\n",d5.year(),d5.month(),d5.day());//2017 1 31,20170228-1个月的时间表示回到上个月的月末,那么这个月份就结束了
boost::gregorian::date d_calc_2(2017,1,1);//以1月最后一日演示
boost::gregorian::date d6=d_calc_2+mt_calc;
TRACE("%d年%d月%d日\n",d6.year(),d6.month(),d6.day());//2017 02 01,2017 01 01+1个月的时间表示递增到下一个月的起始日
boost::gregorian::date d7=d6-mt_calc;
TRACE("%d年%d月%d日\n",d7.year(),d7.month(),d7.day());//2017 1 1,2017 02 01-1个月的时间表示回到上个月的起始日
//date_period 时间周期使用,还提供了其它方法,如移动一个区间,或计算两个重叠区间的交集
boost::gregorian::date d8(2017, 1, 30); //2017 01 30 是开始计算的日期
boost::gregorian::date d9(2017, 2, 1); // 2017 02 01 的前一天才是开始计算的日期,换句话就是2017 01 31
boost::gregorian::date_period dp(d8, d9);
boost::gregorian::date_duration dd_dp = dp.length();
TRACE("天数,%d\n",dd_dp.days());//输出两天
TRACE("d8包含情况,%d\n",dp.contains(d8));
TRACE("d9包含情况,%d\n",dp.contains(d9));//从这里可以看到date_period的计算情况,并不包含了2017 02 01
//boost::gregorian::day_iterator 可以通过操作迭代器,递减递增每天
//还有 boost::gregorian::week_iterator, boost::gregorian::month_iterator 和 boost::gregorian::year_iterator 分别提供了按周、按月或是按年跳的迭代器
boost::gregorian::date d10(2017, 1, 5); //周三
boost::gregorian::day_iterator it(d10);
boost::gregorian::date d11=*++it;//递增1天,周四
TRACE("%d年%d月%d日\n",d11.year(),d11.month(),d11.day());//2017年1月6日
//计算下一个周五的日期,如果当前日期是周五则返回今天,否则返回下一个周五的日期
boost::gregorian::date d12=boost::date_time::next_weekday(*it, boost::gregorian::greg_weekday(boost::date_time::Friday));
TRACE("%d年%d月%d日\n",d12.year(),d12.month(),d12.day());//2017年1月6日
}
catch (std::exception& e)
{
TRACE("%s\n",e.what());
}
#include <boost/date_time/posix_time/posix_time.hpp>
try
{
//与位置无关的时间点
//设置,2017 01 01 经过12 小时的点的时间,2017 01 01 12PM
//boost::posix_time::ptime 可以传递一个 boost::date_time::not_a_date_time 创建一个无效的时间
boost::posix_time::ptime pt(boost::gregorian::date(2017,1,1),boost::posix_time::time_duration(12,0,0));
boost::gregorian::date d_pt=pt.date();
TRACE("%d年%d月%d日\n",d_pt.year(),d_pt.month(),d_pt.day());//输出2017 01 01
boost::posix_time::time_duration td=pt.time_of_day();
TRACE("小时%d,分钟%d,秒%d\n",td.hours(),td.minutes(),td.seconds());//小时12,分钟0,秒0
//构造当前时间的点
boost::posix_time::ptime pt2=boost::posix_time::second_clock::local_time();//使用本地时间,universal_time 返回UTC时间点,boost::posix_time::microsec_clock
TRACE("%d年%d月%d日\n",pt2.date().year(),pt2.date().month(),pt2.date().day());//
TRACE("小时%d,分钟%d,秒%d\n",pt2.time_of_day().hours(),pt2.time_of_day().minutes(),pt2.time_of_day().seconds());//
//字符串构造时间点
boost::posix_time::ptime pt3=boost::posix_time::from_iso_string("20170101T120000");//ISO 8601格式的字符串
TRACE("%d年%d月%d日\n",pt3.date().year(),pt3.date().month(),pt3.date().day());//输出2017 01 01
TRACE("小时%d,分钟%d,秒%d\n",pt3.time_of_day().hours(),pt3.time_of_day().minutes(),pt3.time_of_day().seconds());//小时12,分钟0,秒0
//时间长度,定义1小时,30分钟的长度,也就是持续时间
boost::posix_time::time_duration td_1(1,30,0);
TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_1.hours(),td_1.minutes(),td_1.seconds(),td_1.total_seconds());//小时1,分钟30,秒0,总秒:5400
//时间点计算
boost::posix_time::ptime pt11(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0));
boost::posix_time::ptime pt12(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(18, 30, 0));
boost::posix_time::time_duration td_2 = pt12 - pt11;
TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_2.hours(),td_2.minutes(),td_2.seconds(),td_2.total_seconds());//小时6,分钟30,秒0,总秒:23400
boost::posix_time::time_duration td_3 = pt11 - pt12;
TRACE("小时%d,分钟%d,秒%d,总秒:%d\n",td_3.hours(),td_3.minutes(),td_3.seconds(),td_3.total_seconds());//小时-6,分钟-30,秒0,总秒:-23400
boost::posix_time::ptime pt13(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0));
boost::posix_time::time_duration td_4(6, 30, 0);
boost::posix_time::ptime pt14 = pt13 + td_4; //ptime 与 time_duration 相加
TRACE("小时%d,分钟%d,秒%d\n",pt14.time_of_day().hours(),pt14.time_of_day().minutes(),pt14.time_of_day().seconds());//小时18,分钟30,秒0
{
//时间区间,intersection 可以用于计算时间交集,merge 合并时间区
boost::posix_time::ptime pt1(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0));
boost::posix_time::ptime pt2(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(13, 30, 0));
boost::posix_time::time_period tp(pt1, pt2);
TRACE("%d,%d\n",tp.contains(pt1),tp.contains(pt2));
}
{
boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 05), boost::posix_time::time_duration(12, 0, 0));
//迭代器,操作一次变动6.5个小时
boost::posix_time::time_iterator it(pt, boost::posix_time::time_duration(6, 30, 0));
++it;
boost::posix_time::ptime pt1=*it;
TRACE("小时%d,分钟%d,秒%d\n",pt1.time_of_day().hours(),pt1.time_of_day().minutes(),pt1.time_of_day().seconds());//小时18,分钟30,秒0
++it;
boost::posix_time::ptime pt2=*it;
TRACE("小时%d,分钟%d,秒%d\n",pt2.time_of_day().hours(),pt2.time_of_day().minutes(),pt2.time_of_day().seconds());//小时1,分钟0,秒0
}
}
catch (std::exception& e)
{
TRACE("%s\n",e.what());
}
{
//CET Central European,+1 表示 CET时间比UTC时间早1小时
boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+1"));
//定义一个时间点
boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0));
boost::local_time::local_date_time dt(pt, tz);
TRACE("时区名称:%s\n",dt.zone_name().c_str());
{
boost::gregorian::date pd=dt.utc_time().date();
boost::posix_time::time_duration td =dt.utc_time().time_of_day();
TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
}
{
boost::gregorian::date pd=dt.date();
boost::posix_time::time_duration td =dt.time_of_day();
TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
}
{
boost::gregorian::date pd=dt.local_time().date();
boost::posix_time::time_duration td =dt.local_time().time_of_day();
TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时13,分钟0,秒0
}
}
{
boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+1"));
boost::posix_time::ptime pt(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0));
boost::local_time::local_date_time dt(pt, tz);
TRACE("时区名称:%s\n",dt.zone_name().c_str());
{
boost::gregorian::date pd=dt.local_time().date();
boost::posix_time::time_duration td =dt.local_time().time_of_day();
TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时13,分钟0,秒0
}
//EET,东部欧洲时间,比CET早两个小时
boost::local_time::time_zone_ptr tz2(new boost::local_time::posix_time_zone("EET+2"));
{
boost::gregorian::date pd=dt.local_time_in(tz2).date();
boost::posix_time::time_duration td =dt.local_time_in(tz2).time_of_day();
TRACE("%d年%d月%d日,小时%d,分钟%d,秒%d\n",pd.year(),pd.month(),pd.day(),td.hours(),td.minutes(),td.seconds());//2017年1月5日,小时12,分钟0,秒0
}
}
{
boost::local_time::time_zone_ptr tz(new boost::local_time::posix_time_zone("CET+0"));
boost::posix_time::ptime pt1(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(12, 0, 0));
boost::local_time::local_date_time dt1(pt1, tz);
boost::posix_time::ptime pt2(boost::gregorian::date(2017, 1, 5), boost::posix_time::time_duration(18, 0, 0));
boost::local_time::local_date_time dt2(pt2, tz);
boost::local_time::local_time_period tp(dt1, dt2);
TRACE("%d,%d\n",tp.contains(dt1) ,tp.contains(dt2));//1,0
}