boost--时间处理
date_time库的时间功能位于名字空间boost::posix_time,它提供了微妙级别(最高可达纳秒)的时间系统,使用需要包含头文件"boost\date_time\posix_time\posix_time.hpp"。
1、时间长度类time_duration
类似日期长度类date_duration有days、weeks、months、years这些常用类,time_duration也有几个子类:hours、minutes、seconds、millisec、microsec、nanosec,他们都支持流输入输出、比较操作、加减乘除运算。
//对象的定义
boost::posix_time::time_duration td(, , , ); //1小时10分钟30秒1毫秒
boost::posix_time::time_duration td1(, , , ); //2小时1分钟1毫秒,超出的时间会自动进位
boost::posix_time::time_duration td2 = boost::posix_time::duration_from_string("1:10:30:001"); //1小时10分钟30秒1毫秒 //成员函数
assert(td.hours() == && td.minutes() == && td.seconds() == );
assert(td.total_seconds() == * + * + ); //获取字符串表示
cout << boost::posix_time::to_simple_string(td) << endl; //输出为 01:10:30.001000
cout << boost::posix_time::to_iso_string(td) << endl; //输出为 011030.001000 //运算
boost::posix_time::hours h();
boost::posix_time::minutes m();
boost::posix_time::seconds s();
boost::posix_time::millisec ms();
boost::posix_time::time_duration td3 = h + m + s + ms;
assert(td2 == td3);
2、时间点ptime
创建ptime的方法是在其构造函数传入一个date和一个time_duration,不传入time_duration的话为0点,ptime支持流输入输出、比较操作、减法运算、与date_duration、time_duration的加减运算:
//对象的定义
boost::posix_time::ptime p(boost::gregorian::date(, , )); //2010年3月5号0点
boost::posix_time::ptime p1(boost::gregorian::date(, , ), boost::posix_time::hours()); //2010年3月5号1点
boost::posix_time::ptime p2 = boost::posix_time::time_from_string("2010-3-5 01:00:00");
boost::posix_time::ptime p3 = boost::posix_time::from_iso_string("20100505T010000"); //获取当前时间
boost::posix_time::ptime p4 = boost::posix_time::second_clock::local_time(); //本地时间,秒精度
cout << p4 << endl; //可以直接输出ptime,2018-Apr-11 16:23:54
//boost::posix_time::ptime p4 = boost::posix_time::microsec_clock::local_time(); //本地时间,微妙精度,2018-Apr-11 08:23:54.986535
//boost::posix_time::ptime p4 = boost::posix_time::second_clock::universal_time(); //UTC时间,微妙精度 //获取字符串表示
cout << boost::posix_time::to_iso_extended_string(p) << endl; //输出为2010-03-05T00:00:00
cout << boost::posix_time::to_iso_string(p) << endl; //输出为20100305T000000
cout << boost::posix_time::to_simple_string(p) << endl; //输出为2010-Mar-05 00:00:00
ptime相当于date + time_duration,所以对于它的操作可以分解为对这两个部分的操作,可以通过两个成员函数date()和time_of_day()获得日期和时间段,然后分别处理,如:
boost::posix_time::ptime p4(boost::gregorian::date(, , ), boost::posix_time::hours() + boost::posix_time::minutes());
boost::gregorian::date d = p4.date(); //获取date
boost::posix_time::time_duration td4 = p4.time_of_day(); //获取time_duration assert(d.month() == && d.day() == );
assert(td4.total_seconds() == * + * ); boost::posix_time::ptime p5 = p4 + boost::posix_time::hours();
assert(p4 < p5);
assert(p5 - p4 == boost::posix_time::hours());
p5 += boost::gregorian::months(); boost::posix_time::ptime pTime = boost::posix_time::second_clock::local_time();
std::string strDate = boost::gregorian::to_iso_extended_string(pTime.date()); // 当前日期:2019-03-06
std::string strTimeOfDay = boost::posix_time::to_simple_string(pTime.time_of_day()); // 当前时间:15:03:55
std::string strTime = strDate + ", " + strTimeOfDay; // 当前日期和时间:2019-03-06, 15:03:55
boost::posix_time::to_tm()可以由ptime转换为tm,如果想要把tm转换为ptime,可以使用boost::gregorian::date_from_tm()得到date对象,然后再根据tm得到time_duration对象,最后通过date和time_duration创建出ptime。
boost::posix_time::to_time_t()可以由ptime转换为time_t,boost::posix_time::from_time_t()可以由time_t转换为ptime,但这两个函数是以UTC时间为标准的,使用的话还需要进行时区转换。
不同于日期迭代器,时间迭代器只有一个time_iterator,在它的构造函数中传入一个起始时间ptime和一个步长time_duration,eg:
boost::posix_time::ptime p6(boost::gregorian::date(, , ), boost::posix_time::hours());
boost::posix_time::time_iterator t_iter(p6, boost::posix_time::minutes());
for (; t_iter < p6 + boost::posix_time::hours(); ++t_iter)
{
cout << *t_iter << endl;
}
//输出为:
//2010 - Feb - 27 10:00 : 00
//2010 - Feb - 27 10 : 20 : 00
//2010 - Feb - 27 10 : 40 : 00
3、高精度的timer
boost::timer的精度只有毫秒,利用date_time库可以实现一个微妙级别的计时器:
#include "boost\date_time\posix_time\posix_time.hpp" template<typename Clock = boost::posix_time::microsec_clock>
class basic_ptimer
{
public:
basic_ptimer() { restart(); }
virtual ~basic_ptimer(){}
public:
void restart() { _start_time = Clock::local_time(); }
double elapsed() { return (Clock::local_time() - _start_time).total_microseconds() / (double)( * ); } //以秒为单位,精度为微秒
string elapsed_s() { return boost::posix_time::to_simple_string(Clock::local_time() - _start_time); } //格式为hh:mm:ss.ffffff,精度为微秒
private:
boost::posix_time::ptime _start_time;
};
typedef basic_ptimer<> ptimer; int main()
{
ptimer p2;
Sleep();
printf("%.6f\n", p2.elapsed()); //输出为1.001057
//cout << p2.elapsed_s() << endl; //输出为00:00:01.001057
}
4、不同时区的本地时间
使用本地时间类local_date_time及boost提供的一个文本格式的时区数据库(位于libs/date_time/data/下)可以获得不同时区的本地时间,本地时间功能位于名字空间boost::local_time中,使用本地时间功能需要包含头文件"boost\date_time\local_time\local_time.hpp"。
下面假设飞机从北京2008年1月7号12点整飞往纽约,飞行时间为15个小时,输出飞行到纽约后的本地时间:
#include "boost\date_time\posix_time\posix_time.hpp"
#include "boost\date_time\gregorian\gregorian.hpp"
#include "boost\date_time\local_time\local_time.hpp" int main()
{
boost::local_time::tz_database tz_db;
tz_db.load_from_file("./date_time_zonespec.csv"); //假设文本数据库位于当前目录
boost::local_time::time_zone_ptr shz = tz_db.time_zone_from_region("Asia/Shanghai"); //获得上海时区,即北京时间
boost::local_time::time_zone_ptr nyz = tz_db.time_zone_from_region("America/New_York"); //获得纽约时区 //获得北京当地时间
boost::local_time::local_date_time dt_bj(boost::gregorian::date(, , ),
boost::posix_time::hours(),
shz,
shz->has_dst());//是否夏令时
cout << dt_bj << endl; //飞机起飞时北京时间 dt_bj += boost::posix_time::hours(); //飞机飞行了15小时
cout << dt_bj << endl; //飞机到达纽约后的北京时间 boost::local_time::local_date_time dt_ny = dt_bj.local_time_in(nyz); //由北京时间获得纽约当地时间
cout << dt_ny << endl; //飞机到达纽约后的纽约时间 return ;
}
boost--时间处理的更多相关文章
- boost 时间
利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD [cpp] view plaincopy #include <boost/date_time/gre ...
- boost 时间与日期处理
博客转载自: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确, ...
- date tod = boost::gregorian::day_clock::local_day(); //当前日期
boost 时间和日期 - 苦逼码农 - 博客频道 - CSDN.NET date tod = boost::gregorian::day_clock::local_day(); //当前日期
- boost开发指南
C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...
- Spell Boost
Spell Boost 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Shadowverse is a funny card game. One day you are playing ...
- Boost学习笔记(二) 时间与日期
timer库概述 timer库包含三个组件:分别是计时器类timer.progress_timer和进度指示类progress_display timer 主要作用是计时,精确度是毫秒级.下面是一个简 ...
- 《Boost程序库完全开发指南》读书笔记-日期时间
●timer库 #include <boost\timer.hpp> #include <boost\progress.hpp> 1.timer类 // timer类的示例. ...
- 利用boost获取时间并格式化
利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD #include <boost/date_time/gregorian/gregorian.hpp& ...
- (一)boost库之日期、时间
(一)boost库之日期.时间 一.计时器 计时器,通常在一个项目中统计一个函数的执行时间是非常实用的. #include <boost/timer.hpp> void PrintU ...
- [Boost]boost的时间和日期处理-(1)日期的操作
<开篇> Boost.DateTime库提供了时间日期相关的计算.格式化.转换.输入输出等等功能,为C++的编程提供了便利.不过它有如下特点: 1. Boost.DateTime 只支持1 ...
随机推荐
- 转apk打包
常规打包方式: -------------------------------------------------------------------------------------------- ...
- 使用Go编写WebAssembly
I. Install go 1. down https://golang.org/dl/ go1.12.3.windows-amd64.zip 2. set path (1) GOROOTvar na ...
- JAVA使用log4j(另SSM框架中使用log4j)
1.引入jar包 log4j-1.2.13.jar 2.src下建立配置文件:log4j.properties #不+All,只写后一种LOG log4j.rootLogger =ALL,system ...
- java中Arrays的用法
Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 一 数组复制 与使用System.arraycopy进行数组复制类似的, Arrays提供了一个 ...
- Django model 字段类型及选项解析
字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...
- Bootstrap关闭当前页
function doBack() { var index = parent.layer.getFrameIndex(window.name); parent.lay ...
- java 中文繁简体转换工具 opencc4j
创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...
- Spring MVC 之 ContentNegotiatingViewResolver
我们已经知道 对于 RequestMappingInfoHandlerMapping, 它在对带有后缀的http 请求进行匹配的时候,如果找不到精确的pattern, 那么就会 pattern+.* ...
- 尚硅谷springboot学习31-jdbc数据连接
可以使用JdbcTemplate操作数据库,可以在启动的时候自动建表,更新数据表 配置依赖 <dependency> <groupId>org.springframework. ...
- 学JS的心路历程 - JS应用
各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...