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--时间处理的更多相关文章

  1. boost 时间

    利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD [cpp] view plaincopy #include <boost/date_time/gre ...

  2. boost 时间与日期处理

    博客转载自: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确, ...

  3. date tod = boost::gregorian::day_clock::local_day(); //当前日期

    boost 时间和日期 - 苦逼码农 - 博客频道 - CSDN.NET date tod = boost::gregorian::day_clock::local_day(); //当前日期

  4. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

  5. Spell Boost

    Spell Boost 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Shadowverse is a funny card game. One day you are playing ...

  6. Boost学习笔记(二) 时间与日期

    timer库概述 timer库包含三个组件:分别是计时器类timer.progress_timer和进度指示类progress_display timer 主要作用是计时,精确度是毫秒级.下面是一个简 ...

  7. 《Boost程序库完全开发指南》读书笔记-日期时间

    ●timer库 #include <boost\timer.hpp> #include <boost\progress.hpp> 1.timer类 // timer类的示例. ...

  8. 利用boost获取时间并格式化

    利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD #include <boost/date_time/gregorian/gregorian.hpp& ...

  9. (一)boost库之日期、时间

    (一)boost库之日期.时间 一.计时器  计时器,通常在一个项目中统计一个函数的执行时间是非常实用的.   #include <boost/timer.hpp> void PrintU ...

  10. [Boost]boost的时间和日期处理-(1)日期的操作

    <开篇> Boost.DateTime库提供了时间日期相关的计算.格式化.转换.输入输出等等功能,为C++的编程提供了便利.不过它有如下特点: 1. Boost.DateTime 只支持1 ...

随机推荐

  1. 转apk打包

    常规打包方式: -------------------------------------------------------------------------------------------- ...

  2. 使用Go编写WebAssembly

    I. Install go 1. down https://golang.org/dl/ go1.12.3.windows-amd64.zip 2. set path (1) GOROOTvar na ...

  3. JAVA使用log4j(另SSM框架中使用log4j)

    1.引入jar包 log4j-1.2.13.jar 2.src下建立配置文件:log4j.properties #不+All,只写后一种LOG log4j.rootLogger =ALL,system ...

  4. java中Arrays的用法

    Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 一 数组复制 与使用System.arraycopy进行数组复制类似的, Arrays提供了一个 ...

  5. Django model 字段类型及选项解析

    字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...

  6. Bootstrap关闭当前页

       function doBack() {        var index = parent.layer.getFrameIndex(window.name);        parent.lay ...

  7. java 中文繁简体转换工具 opencc4j

    创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...

  8. Spring MVC 之 ContentNegotiatingViewResolver

    我们已经知道 对于 RequestMappingInfoHandlerMapping, 它在对带有后缀的http 请求进行匹配的时候,如果找不到精确的pattern, 那么就会 pattern+.* ...

  9. 尚硅谷springboot学习31-jdbc数据连接

    可以使用JdbcTemplate操作数据库,可以在启动的时候自动建表,更新数据表 配置依赖 <dependency> <groupId>org.springframework. ...

  10. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...