C++通过boost.date_time进行时间运算

标准C函数的时间运算是非常不好用的,boost提供了一个跨平台的日期库boost.date_time,通过它可以快速实现各种时间运算。

boost.date_time中的时间对象为boost::posix_time::ptime,在<boost/date_time.hpp>中定义,它的常用操作如下。

获取现在时间:

ptime now = second_clock::local_time();
cout << now << endl;

获取日期信息:

cout << now.date().day_of_week();

通过偏移获取新时间:

ptime today = now - now.time_of_day();
ptime next_time = now + years(1) + months(1) + days(1) - hours(1);

计算时间差:

time_duration timespan = now - today;

时间比较:

bool result = next_day > now;

字符串转换为时间

标准格式的字符串可以通过time_from_string转换。

cout << time_from_string("2010-09-10 10:01:01");

但对于非标准的格式的时间,则需要自定义解析函数。这里我简单的写了一个:

ptime time_parse_exact(const string& time_str, const string& format)
{
    ptime output;
    time_input_facet facet1(format, 1);

    std::stringstream ss1(time_str);
    ss1.imbue(std::locale(ss1.getloc(), &facet1));
    ss1 >> output;

    return output;
}
cout << time_parse_exact("2010/09/10-10:01:01", "%Y/%m/%d-%H:%M:%S");

精准计时

对于一般的计时操作,可以通过前面的时间差运算获取。但是,有的时候需要高精度计时操作,这个时候需要用到boost的另外一个库cpu_timer。

#include <boost/timer/timer.hpp>
int main(void)
{
    boost::timer::cpu_timer timer;
    for (long i = 0; i < 100000000; ++i)
        std::sqrt(123.456L);

    cout << timer.format() << endl;
    //std::cout << timer.format(5, "%ws wall time,%ts totle time\n");

    return 0;
}

关于cpu_timer更多信息,请参看boost官方文档

到此这篇关于C++通过boost.date_time进行时间运算的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++ boost::asio编程-域名解析详细介绍

    C++ boost::asio编程-域名解析 在网络通信中通常我们并不直接使用IP地址,而是使用域名.这时候我们就需要用reslover类来通过域名获取IP,它可以实现 与IP版本无关的网址解析. #include "stdafx.h" #include "boost/asio.hpp" #include "boost/shared_ptr.hpp" #include "boost/thread.hpp" #include &

  • C++用boost.signal实现多播委托

    boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式: void print_sum(float x, float y) { std::cout << "The sum is " << x+y << std::endl; } void print_product(float x, float y) { std::cout << "The product is " << x*y

  • C++中的boost::function库简介

    boost::function Boost.Function库用来提供一个对象化的函数指针,通过它可以很容易的将一个函数封装为仿函数. boost::function库可以支持自由函数,函数对象,类成员函数.而且参数个数多达10个.boost::function库利用模板技术来实现.生成的代码有很高的运行效率.首先我们还是以一个例子简单的说明它的用法: #include <iostream> #include <boost/function.hpp> using namespace

  • C++中Boost的转换函数

    Boost的转换函数是对C++中的四种类型转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)的一些补充和扩展,在阅读本文前,请先熟悉C++中的四种类型转换函数相关知识. polymorphic_cast C++提供了dynamic_cast来实现运行时的类型转换,但是如果用来转换指针时,需要记得检查返回值(这是很多程序员容易忘掉的地方),否则一旦转换失败,将获得一个NULL指针,无异于给程序埋下了一个定时炸弹. Boost的pol

  • C++中Boost.Chrono时间库的使用方法

    前言 大家应该都有所体会,时钟这个东西在程序中扮演者重要的角色,在系统编程的时候睡眠.带超时的等待.带超时的条件变量.带超时的锁都会用到,但是往往对特定系统依赖性很大,感觉即使不考虑系统的跨平台性,如果能使用一个稳定的接口,同时如果能够方便的对时刻.时段等进行相关的操作和运算,将是再好不过的了. 在boost库中和时间相关的库有Boost.DateTime和Boost.Chrono,前者专注于时间时刻以及本地化相关的内容,而后者主要是时刻.时长和时间的计算等内容.当然,C++11标准已经支持st

  • C++ boost库的安装过程详解

    Windows安装boost库 下载链接:https://www.boost.org/ 学习链接:https://theboostcpplibraries.com/ 1,下载解压,我的目录"C:\Program Files (x86)\Microsoft Visual Studio\2017" 2,以管理员身份运行"适用于 VS 2017 的 x64 本机工具命令提示" 3,执行以下命令进行编译: cd /d "C:\Program Files (x86)

  • C++基于Boost库实现命令行解析

    第一次尝试 #include <iostream> #include <boost/program_options.hpp> // 定义命名空间 namespace opt = boost::program_options; int main(int argc, char const *argv[]) { opt::options_description desc("Usage: 32位端口快速扫描器\n\n options: \n"); desc.add_op

  • C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.ICMP通信协议. 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点就是执着!所有的操作都要完成或出错才会返回,不过偶的执着被大家称之为阻塞,实在是郁闷~~(场下一片嘘声),其实这样 也是有好处的,比如逻辑清晰,编程比较容易. 在服务器端,我会做个socket交给acceptor对象,让它

  • C++ Boost PropertyTree解析INI文件详解

    目录 前言 什么是property_tree? 实现代码 前言 PropertyTree是一个非常牛叉的东西!虽然很小,但是,相当需要,相当重要!因为,很多的东西,我们不需要去开发,只需要去用就好了,这个东西的开发正的是极好极好的! 更重要的是,它来自大名鼎鼎的Boost库,这个库的重要性,已经是不言而喻了! property_tree是一个保存了多个属性的树形数据结构! 可以使用类似访问路径的方式问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点. property_tree适合

  • C++通过boost.date_time进行时间运算

    标准C函数的时间运算是非常不好用的,boost提供了一个跨平台的日期库boost.date_time,通过它可以快速实现各种时间运算. boost.date_time中的时间对象为boost::posix_time::ptime,在<boost/date_time.hpp>中定义,它的常用操作如下. 获取现在时间: ptime now = second_clock::local_time(); cout << now << endl; 获取日期信息: cout <

  • 非常全面的php日期时间运算汇总

    实例讲解之前,先来介绍几个核心函数:  mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳. 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响. 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值. 语法:mktime(hour,minute,second,month,day,year,is_dst) 参数               描述  hour       可选.规定小时.  minute   可选.规定分钟.  second   可

  • Shell时间运算及时间差计算方法

    最近一段时间,在处理Shell 脚本时候,遇到时间的处理问题. 时间的加减,以及时间差的计算. 一.时间加减 这里处理方法,是将基础的时间转变为时间戳,然后,需要增加或者改变时间,变成 秒. 如:1990-01-01 01:01:01  加上 1小时 20分 处理方法: a.将基础时间转为时间戳 time1=$(date +%s -d '1990-01-01 01:01:01') echo $time1 631126861 [时间戳] b.将增加时间变成秒 [root@localhost ~]#

  • C++ boost 时间与日期处理详细介绍

    boost 时间与日期处理 导视: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确,可派生个类,调用stream的precision设置 progress_display 图形化显示进度 只能输出到cout 如果还有其他输出则会干扰进度显示. 折中的办法是重新显示 pd.restart(size); pd+= pNum; date 日期结构,时间点 -- da

  • 利用boost获取时间并格式化的方法

    利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1.   输出YYYYMMDD #include <boost/date_time/gregorian/gregorian.hpp> #define BOOST_DATE_TIME_SOURCE std::string strTime = boost::gregorian::to_iso_string(\ boost::gregorian::day_clock::local_day()); std::cout <<

  • C++中Boost库裁剪与其应用详解

    前言 Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),还有算法.函数对象和高阶编程相关子库如functional 库.lambda 库和 signal 库,还有泛型编程.模板编程子库如 call traits.mpl,还有并发编程相关的 thread 库,等等等等. Boost 是如此

  • 一篇文章搞定Mysql日期时间函数

    前言 日期和时间函数部分也是我们日常工作中使用频率比较高的一部分.这一篇我们主要讲讲Mysql里面的日期时间相关的函数,不同数据库之间基本相同,只会有个别函数的差异.大家掌握一个数据库的,其他的遇到不会的,直接查就可以了. 1.获取当前时刻时间 1.1返回当前时刻的日期和时间 1.2获取当前时刻的日期 1.3获取当前时刻的时间 1.4获取当前时刻的周数 2.日期时间格式转换 3.日期时间运算 3.1向后偏移时间 3.2向前偏移时间 3.3两日期做差 文章较长,建议先收藏,慢慢读. 1.获取当前时

  • MySQL日期与时间函数的使用汇总

    本文基于MySQL8.0 本文介绍MySQL关于日期和时间操作的函数. 日期和时间函数 函数 描述 ADDDATE() 给日期值添加时间值 ADDTIME() 添加time CONVERT_TZ() 从一个时区转换为另一个时区 CURDATE() 返回当前日期 CURRENT_DATE(), CURRENT_DATE 和CURDATE()同义 CURRENT_TIME(), CURRENT_TIME 和CURDATE()同义 CURRENT_TIMESTAMP(), CURRENT_TIMEST

  • go语言中的Carbon库时间处理技巧

    go语言之Carbon库 carbon是一个时间扩展库,它提供了易于使用接口. 简单示例: package main import ( "fmt" "github.com/uniplaces/carbon" "time" ) func main() { // 打印当前时间 now :=carbon.Now().DateTimeString() fmt.Println("本地时间:", now) Japantoday, _ :=

随机推荐