参考
头文件
#include <boost/date_time/posix_time/posix_time.hpp>
时间长度
初始化
创建时间长度,构造函数中直接传入时分秒和微秒值
这里传入的时分秒微秒的值并不一定要在各自的限度内,超出限度的时间会自动进位
boost::posix_time::time_duration td1(1, 10, 30, 1000 * 1000 * 31);
std::cout << td1.total_microseconds() << std::endl;
但需要注意的是,这里传入的值不能存在负值
boost::posix_time::time_duration td1(1, 10, 30, -100);
std::cout << td1.total_microseconds() << std::endl;
可以通过传入字符串获取时间长度,字符串中时分秒微秒必须是冒号分割的
boost::posix_time::time_duration td = boost::posix_time::duration_from_string("1:10:30:001"); // 01:10:30
需要注意的是,这里可以传入负数
td = boost::posix_time::hours(1) + boost::posix_time::minutes(10) + boost::posix_time::seconds(59);
时间长度 加法
时间长度加法,需要注意的是,这里可以传入负数
td = boost::posix_time::hours(1) + boost::posix_time::minutes(10) + boost::posix_time::seconds(59);
时间长度 除法
td = td/2;
时间长度 乘法
td = td*2;
时间长度 减法
td = td - boost::posix_time::seconds(59);
获取参数
获取小时
td2.hours()
获取分钟
td2.minutes()
获取秒数
td2.seconds()
获取总秒数
td2.total_seconds()
获取总毫秒数
td.total_milliseconds()
获取总微秒数
td.total_microseconds()
时间精度
#include <iostream>
#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG // 必须在头文件之前定义宏,否则无效!!!
#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char *argv[])
{
// 第四个参数,如果精确度是微秒,单位就是微秒,如果精确度是纳秒,单位就是纳秒
boost::posix_time::time_duration td(1, 10, 30, 1000); // 01:10:30
// 查看当前的精确度
if (td.resolution() == boost::date_time::nano) printf("精确度:纳秒\n");
else printf("精确度:微秒\n");
//td += boost::posix_time::nanoseconds(100);
// 返回秒的小数部分的位数(微秒6位,纳秒9位)
std::cout << td.num_fractional_digits() << std::endl;
//返回当前的总纳秒数
std::cout << td.total_nanoseconds() << std::endl;
}
不加入宏定义结果输出
加入宏定义时间输出
时间类
本地时间
秒级 :获取计算机本地时间
boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
std::cout << pt << std::endl;
秒级:本地UTC时间
boost::posix_time::ptime pt = boost::posix_time::second_clock::universal_time();
std::cout << pt << std::endl;
微秒级:本地时间
boost::posix_time::ptime pt = boost::posix_time::microsec_clock::local_time();
std::cout << pt << std::endl;
微秒级:本地UTC时间
boost::posix_time::ptime pt = boost::posix_time::microsec_clock::universal_time();
std::cout << pt << std::endl;
字符串转换时间
日期与时间中间以空格区分
boost::posix_time::ptime pt = boost::posix_time::time_from_string("2021-11-24 14:11:34");
日期与时间中间以T区分
boost::posix_time::ptime pt = boost::posix_time::from_iso_string("20211124T141134");
初始化
ptime的初始化以日期+时间完成初始化
日期类为:
boost::gregorian::date
头文件
#include <boost/date_time/gregorian/gregorian.hpp>
初始化时间为2022-06-29-14-09-14
boost::gregorian::date dt(2022, 06, 29);
boost::posix_time::time_duration td(14, 9, 14);
boost::posix_time::ptime pt(dt, td);
只传入日期,初始化时间为00:00:00
boost::posix_time::ptime pt1(dt);
ptime的输出
默认输出与to_simple_string一样输出格式为2022-Jun-29 21:59:02
格式为年-月(英语缩写)-日 时:分:秒
boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
std::cout << pt << std::endl;
格式为年-月(英语缩写)-日 时:分:秒
std::cout << boost::posix_time::to_simple_string(pt) << std::endl;
输出格式为:年月(数字)日T时分秒
std::cout << boost::posix_time::to_iso_string(pt) << std::endl;
输出格式为年-月(数字)-日T时:分:秒
std::cout << boost::posix_time::to_iso_extended_string(pt) << std::endl;
与C语言接口转换
本地时间转换
time_t timer = time(NULL);
tm *t_tm = localtime(&timer);
pt = boost::posix_time::ptime_from_tm(*t_tm);
tm t = boost::posix_time::to_tm(pt);
printf("%4d-%02d-%02d %02d:%02d:%02d\n", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
UTC时间
boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
time_t timer = time(NULL);
timer = boost::posix_time::to_time_t(pt);
pt = boost::posix_time::from_time_t(timer);
算法
获取从当天0时开始的时间长度
boost::posix_time::time_duration td1 = pt.time_of_day();
向后推算一个小时
pt = pt + boost::posix_time::hours(10);
与某个时间节点相差的时间长度
boost::posix_time::ptime pt1 = boost::posix_time::time_from_string("2021-11-24 14:11:34");
boost::posix_time::time_duration td2 = pt1 - pt;
std::cout << td1 << std::endl;
sleep
线程里的接口,但个人感觉放到这里比较合适
#include <boost/thread.hpp>
boost::this_thread::sleep(boost::posix_time::millisec(100));
日期
初始化
构造函数初始化
boost::gregorian::date date1;//一个无效日期
boost::gregorian::date date2(2021, 9, 16);//使用数字构造日期
boost::gregorian::date date3(2021, boost::gregorian::Sep, 16);//使用英文构造日期
boost::gregorian::date date4(date2);//拷贝构造
字符串初始化
boost::gregorian::date date5 = boost::gregorian::from_string("2021/09/16");
boost::gregorian::date date5 = boost::gregorian::from_string("2021-09-16");
boost::gregorian::date date6 = boost::gregorian::from_undelimited_string("20210916");
获取当天日期对象
boost::gregorian::date date7 = boost::gregorian::day_clock::local_day();
boost::gregorian::date date8(boost::date_time::min_date_time);//使用特殊时间枚举创建日期
pos_infin:正无限
neg_infin:负无限
no_a_date_time:无效时间
min_date_time:可表示的最小日期或时间
max_date_time:可表示的最大日期或时间
日期接口
获取年月日方式1
std::cout << date6.year() << std::endl;
std::cout << date6.month() << std::endl;//英文方式
std::cout << date6.day() << std::endl;
获取年月日方式2
boost::gregorian::date::ymd_type ymd = date6.year_month_day();
std::cout <<ymd.year << std::endl;
std::cout <<ymd.month << std::endl;//英文方式
std::cout <<ymd.day << std::endl;
//返回日期的星期几英语模式。
std::cout << date6.day_of_week() << std::endl;
//该日期是这一年的第几天
std::cout << date6.day_of_year() << std::endl;
//返回当月的最后一天的 date 对象。
std::cout << date6.end_of_month() << std::endl;
//所在的星期是这一年的第几周
std::cout << date6.week_number() << std::endl;
格式化输出
转换为YYYY-mmm(英语缩写)-DD格式的字符串
std::cout<<to_simple_string(d8)<<std::endl;
转换为YYYYMM(英语缩写)DD格式的数字字符串
std::cout<<to_iso_string(d8)<<std::endl;
转换为YYYY-MM(数字)-DD格式的数字字符串
std::cout<<to_iso_extended_string(d8)<<std::endl;
相关算法
boost::gregorian::date date1(2021, 9, 18);//一个无效日期
boost::gregorian::date date2(2021, 9, 16);//使用数字构造日期
std::cout << "两日期之差" << date2 - date1 << "天" << std::endl;
date2 += boost::gregorian::days(10);//天数
std::cout<< boost::gregorian::to_iso_extended_string(date2) <<std::endl;
date2 += boost::gregorian::months(2);//月份
std::cout << boost::gregorian::to_iso_extended_string(date2) << std::endl;
date2 -= boost::gregorian::weeks(1);//星期
std::cout << boost::gregorian::to_iso_extended_string(date2) << std::endl;