• boost--时间处理


      date_time库的时间功能位于名字空间boost::posix_time,它提供了微妙级别(最高可达纳秒)的时间系统,使用需要包含头文件"boostdate_timeposix_timeposix_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, 1000); //1小时10分钟30秒1毫秒
        boost::posix_time::time_duration  td1(1, 60, 60, 1000); //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() == 1 && td.minutes() == 10 && td.seconds() == 30);
        assert(td.total_seconds() == 1 * 3600 + 10 * 60 + 30);
        
        //获取字符串表示
        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(1);
        boost::posix_time::minutes m(10);
        boost::posix_time::seconds s(30);
        boost::posix_time::millisec ms(1);
        boost::posix_time::time_duration td3 = h + m + s + ms;
        assert(td2 == td3);
    View Code

    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)); //2010年3月5号0点
        boost::posix_time::ptime p1(boost::gregorian::date(2010, 3, 5), boost::posix_time::hours(1)); //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
    View Code

       ptime相当于date + time_duration,所以对于它的操作可以分解为对这两个部分的操作,可以通过两个成员函数date()和time_of_day()获得日期和时间段,然后分别处理,如:

        boost::posix_time::ptime p4(boost::gregorian::date(2010, 3, 20), boost::posix_time::hours(12) + boost::posix_time::minutes(30));
        boost::gregorian::date d = p4.date(); //获取date
        boost::posix_time::time_duration td4 = p4.time_of_day(); //获取time_duration
    
        assert(d.month() == 3 && d.day() == 20);
        assert(td4.total_seconds() == 12 * 3600 + 30 * 60);
    
        boost::posix_time::ptime p5 = p4 + boost::posix_time::hours(3);
        assert(p4 < p5);
        assert(p5 - p4 == boost::posix_time::hours(3));
        p5 += boost::gregorian::months(1);
        
        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
    View Code

       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(2010, 2, 27), boost::posix_time::hours(10));
        boost::posix_time::time_iterator t_iter(p6, boost::posix_time::minutes(20));
        for (; t_iter < p6 + boost::posix_time::hours(1); ++t_iter)
        {
            cout << *t_iter << endl;
        }
        //输出为:
        //2010 - Feb - 27 10:00 : 00
        //2010 - Feb - 27 10 : 20 : 00
        //2010 - Feb - 27 10 : 40 : 00
    View Code

    3、高精度的timer

      boost::timer的精度只有毫秒,利用date_time库可以实现一个微妙级别的计时器:

    #include "boostdate_timeposix_timeposix_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)(1000 * 1000); } //以秒为单位,精度为微秒
        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(1000);
        printf("%.6f
    ", p2.elapsed()); //输出为1.001057
        //cout << p2.elapsed_s() << endl; //输出为00:00:01.001057
    }
    View Code

    4、不同时区的本地时间

      使用本地时间类local_date_time及boost提供的一个文本格式的时区数据库(位于libs/date_time/data/下)可以获得不同时区的本地时间,本地时间功能位于名字空间boost::local_time中,使用本地时间功能需要包含头文件"boostdate_timelocal_timelocal_time.hpp"。

      下面假设飞机从北京2008年1月7号12点整飞往纽约,飞行时间为15个小时,输出飞行到纽约后的本地时间:

    #include "boostdate_timeposix_timeposix_time.hpp"
    #include "boostdate_timegregoriangregorian.hpp"
    #include "boostdate_timelocal_timelocal_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(2008, 1, 7), 
                                                                        boost::posix_time::hours(12), 
                                                                        shz, 
                                                                        shz->has_dst());//是否夏令时
        cout << dt_bj << endl; //飞机起飞时北京时间
    
        dt_bj += boost::posix_time::hours(15); //飞机飞行了15小时
        cout << dt_bj << endl; //飞机到达纽约后的北京时间
    
        boost::local_time::local_date_time dt_ny = dt_bj.local_time_in(nyz); //由北京时间获得纽约当地时间
        cout << dt_ny << endl; //飞机到达纽约后的纽约时间
        
        return 0;
    }
    View Code
  • 相关阅读:
    零基础用Docker部署微服务
    HashMap负载因子为什么是0.75
    一个JavaBean和DTO转换的优秀案例
    golang三方包应该如何安装--在线和离线
    Restful API 设计参考原则
    消息队列 RabbitMQ
    Python中的str与unicode处理方法
    MySQL索引背后的数据结构及算法原理
    Python面试题目--汇总
    How to check Logstash's pulse
  • 原文地址:https://www.cnblogs.com/milanleon/p/8795808.html
Copyright © 2020-2023  润新知