c++11提供了日期时间相关的库 chrono,通过chrono库可以很方便的处理日期和时间。

1. 记录时间长度的duration

    template<class Rep, class Period = std::ratio<1,1>>
class Duration;
//第一个模板参数Rep是一个数值类型,表示时钟数的类型;第二个模板参数是一个默认模板参数 std::ratio,表示时钟周期。
template<std::intmax_t Num, std::intmax_t Denom = 1>
class ratio;
//ratio表示分子除以分母得到的分数值,单位为秒。如 ratio<2> 表示一个时钟周期为2秒,ratio<1,1000> 表示一个时钟周期为1/1000秒。如有:
typedef duration <Rep, ratio<3600,1> > hours;
typedef duration<Rep, ratio<1,1>> seconds;
typedef duration<Rep, ration<1,1000000>> microseconds;
通过定义这些常用的时间间隔类型,可以很方便的使用它们,比如线程的休眠:
std::this_thread::sleep_for(std::chrono::seconds(3));
std::this_thread::sleep_for(std::chrono::microseconds(3));

duration可以进行运算,如计算两个之差:

    std::chrono::minutes t1(10);
std::chrono::seconds t2(60);
std::chrono::seconds t3 = t1 - t2; //只能为 minute向seconds,milliseconds转换,不能反过来
std::cout << t3.count() << " seconds" << std::endl;

duration的加减运算有一定的规则,当两个duration时钟周期不相同的时候,先统一成一种时钟,然后再做加减运算。统一成一种时钟的规则如下: 
    对于 ration< x1, y1> count1, ration< x2, y2> count2; 如果x1, x2的最大公约数为x; y1, y2的最小公倍数为 y,则统一之后的ration 为 ration< x, y>.

    chrono::duration<int, std::ratio<9, 7>> d1(3);
std::chrono::duration<int, std::ratio<6, 5>> d2(1);
auto d3 = d1 - d2;
cout << typeid(d3).name() << endl;
cout << d3.count() << endl;
//得到的d3的 typeid(t3).name()为 std::chrono::duration<double, std::ration<3, 35>>;

duration可以进行不同时钟周期的转换,通过 duration_cast来实现:

    std::chrono::minutes t1(10);
std::chrono::seconds t2(60);
std::chrono::milliseconds t3 = t1 -t2;
std::cout << t3.count() << " milliseconds" << std::endl;
std::cout << std::chrono::duration_cast<std::chrono::minutes>(t3).count() << " minutes" << std::endl;
//将秒的时钟周期转换为分钟的时钟周期,然后通过count得到转换后的分钟时钟周期的时间间隔

2. 表示时间点的time point

time_point表示一个时间点,用来获取从它的clock的纪元开始所经过的duration(比如,可能是 1970.1.1以来的时间间隔)和当前的时间,可以做一些时间的比较和算术运算,可以和ctime库结合起来显示时间。 
    time_point必须使用clock来计时。

    using namespace std::chrono;
using days_type = duration < int, std::ratio<60 * 60 * 24> > ;
time_point<system_clock, days_type> today =
time_point_cast<days_type>(system_clock::now());
std::cout << today.time_since_epoch().count() << " days since epoch" << endl;

time_point还支持一些算术运算,比如两个 time_point 的差值时钟周期数,还可以和duration 相加减。要注意不同的clock的time_point是不能进行算术运算的。

    system_clock::time_point now = system_clock::now();
std::time_t last = system_clock::to_time_t(now - hours(24));
std::time_t next = system_clock::to_time_t(now + hours(24));
std::cout << "one day ago, time was : " << std::asctime(std::localtime(&last)) << std::endl;
std::cout << "one day after, time is : " << std::asctime(std::localtime(&next)) << std::endl;

3. 获取系统时钟的clocks

clocks分为以下三种: 
(1)system_clock: 代表真实世界的挂钟时间,具体时间值依赖于系统。system_clock保证提供的时间是一个可读的时间。 
(2)steady_clock: 不能被“调整”的时间,保证先后调用now()得到的时间值不会递减 
(3)high_resolution_clock: 高精度时间,实际上是system_clock或者steady_clock的别名,可以通过now()来获取当前时间点 
。 
    system_clock的to_time_t方法可以将一个time_point转换为ctime, from_time_t 可以将一个ctime转化为time_point:

    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::chrono::time_point<std::chrono::system_clock> tp = std::chrono::system_clock::from_time_t(now_c);

c++11 处理时间和日期的更多相关文章

  1. 精通 Oracle+Python,第 2 部分:处理时间和日期

    从 Python 2.4 版开始,cx_Oracle 自身可以处理 DATE 和 TIMESTAMP 数据类型,将这些列的值映射到 Python 的 datetime 模块的 datetime 对象中 ...

  2. (原创)c++11中的日期和时间库

    c++11提供了日期时间相关的库chrono,通过chrono相关的库我们可以很方便的处理日期和时间.c++11还提供了字符串的宽窄转换功能,也提供了字符串和数字的相互转换的库.有了这些库提供的便利的 ...

  3. Day.js 是一个轻量的处理时间和日期的 JavaScript 库

    Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...

  4. Java 8 (11) 新的日期和时间API

    在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.这个类只能以毫秒的精度表示时间.这个类还有很多糟糕的问题,比如年份的起始选择是1900年,月份的起始从0开始.这意味着你 ...

  5. 11、Java 日期时间 日期工具类

    一.简介 在Java8之前,日期时间API一直被开发者诟病,包括:java.util.Date是可变类型,SimpleDateFormat非线程安全等问题.故此,Java8引入了一套全新的日期时间处理 ...

  6. CUBRID学习笔记 11 数据类型之日期

    datetime 虽然和mysql很相像,但是日期类型和mysql是不一样的.和sqlserver差不多. 如YYYY-MM-DD hh:mi:ss.fff or mm/dd/yyyy hh:mi:s ...

  7. python处理时间和日期

    时间和日期  (图中错误修正:dt_obj.strftime(format))     import time, datetime 1. datetime obj 1) datetime dateti ...

  8. python 处理时间和日期

    转自: https://www.cnblogs.com/65702708/archive/2011/04/17/2018936.html Python格式化日期时间的函数为datetime.datet ...

  9. Python学习进程(11)日期和时间

        本节介绍Python应用程序处理时间和日期的方式.其中转换日期格式是最常用的功能.     (1)获取时间戳: Python 提供了一个 time 和 calendar 模块可以用于格式化日期 ...

随机推荐

  1. [shell]shell脚本统计数值大小

    #! /bin/bash array=( ... ) var1= var2= ;i<=;i++)); do array[i]="$( cat /sys/bus/iio/devices/ ...

  2. 函数调用前有"::"符号,什么意思啊?

    struct ifreq ifrf; ::memset(&ifrf,0,sizeof(ifrf)); ::strncpy(ifrf.ifr_name, ifr[addrCount].ifr_n ...

  3. 数据库 proc编程八

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  4. 自然语言交流系统 phxnet团队 创新实训 个人博客 (一)

    项目涉及链表操作,遂整理: 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理.但是链表失去了数组随机读取的优点,同时链表由于增加了结点 ...

  5. 关于Unity中使用刚体制作简单跑酷案例

    一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...

  6. 关于在Android中添加事件监听器的方法

    一.匿名内部类 1.先找到那个控件(初始化) private Button bt1;  //onCreate方法外 bt1 = (Button)findViewById(R.id.button1); ...

  7. 【转】MFC CreateFont 用法

    中国人自古就有自右至左.从上到下书写汉字的习惯.而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字.有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实 ...

  8. (转)ffplay的音视频同步分析之视频同步到音频

          以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmp ...

  9. php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...

  10. Python的类和函数的魔法

    class CustomClass: def customFun(self, id): print("fun_1",id ) if __name__ == '__main__': ...