c++日期chrono

时间精度ratio

描述一段时间,我们可以用时分秒,日月年等等。所以要有一个精度来表示一段时间。
定义如下:

template<intmax_t _Nx,intmax_t _Dx = 1>
    struct ratio
    {   // holds the ratio of _Nx to _Dx

    static constexpr intmax_t num = _Sign_of<_Nx>::value* _Sign_of<_Dx>::value * _Abs<_Nx>::value / _Gcd<_Nx, _Dx>::value;
    static constexpr intmax_t den = _Abs<_Dx>::value / _Gcd<_Nx, _Dx>::value;
    typedef ratio<num, den> type;
    };

包括两个字段,num和den。用num和den的比值表示精度。默认是秒。
实例如下:

#include <iostream>
#include <ratio>

using namespace std;

int main() {
    ratio<1> ratioSeconds;//精度为秒
    cout << "num=" << ratioSeconds.num << "  den=" << ratioSeconds.den << endl;
    ratio<60> ratioMinutes;//60秒,精度为分钟
    cout << "num=" << ratioMinutes.num << "  den=" << ratioMinutes.den << endl;
    ratio<3600> ratioHours;//3600秒,精度为小时
    cout << "num=" << ratioHours.num << "  den=" << ratioHours.den << endl;

    return 0;
}

输出结果:

num=1  den=1
num=60  den=1
num=3600  den=1

时间段duratgion

duration表示一段时间,比如1个小时,1天,1年等。定义如下:

template<class _Rep, class _Period> class duration

_Rep:表示一种数值类型,比如int,long
_Period:表示精度ratio。

实例如下:

#include <iostream>
#include <ratio>
#include <chrono>


using namespace std;

int main() {
    typedef chrono::duration<int> seconds_type;//定义以秒为单位的一段时间
    typedef chrono::duration<int, ratio<60>> minutes_type;//定义以分钟为单位的一段时间
    typedef chrono::duration<int, ratio<3600>> hours_type;//定义以小时为单位的一段时间

    seconds_type seconds(3600);
    minutes_type minute(60);
    hours_type hours(1);

    //count方法返回时间段长度
    cout << seconds.count() << "s" <<  endl;
    cout << minute.count() << "m" << endl;
    cout << hours.count() << "h" << endl;
    return 0;
}

输出结果:

3600s
60m
1h

为了方便c++内置几种时间段类型,如下:

#include <iostream>
#include <ratio>
#include <chrono>
using namespace std;
int main() {
    chrono::hours hours(1);
    chrono::minutes minutes(60);
    chrono::seconds seconds(3600);
    chrono::milliseconds millis(1000);
    chrono::microseconds micros(1000000);
    chrono::nanoseconds nanos(1000000000);

    //count方法返回时间段长度
    cout << hours.count() << "h" <<  endl;
    cout << minutes.count() << "m" << endl;
    cout << seconds.count() << "s" << endl;
    cout << millis.count() << "mls" << endl;
    cout << micros.count() << "mcs" << endl;
    cout << nanos.count() << "ns" << endl;
    return 0;
}

输出结果:

1h
60m
3600s
1000mls
1000000mcs
1000000000ns
时间段之间的转换

时间段之间是可以互相转换的,比如1小时等于多少分钟,3600秒等于多少小时。我们使用duration_cast方法进行转换。

#include <iostream>
#include <ratio>
#include <chrono>
using namespace std;

int main() {
    chrono::hours hours(1);
    chrono::minutes minutes(60);
    chrono::seconds seconds(3600);

    chrono::minutes hours_to_minute(chrono::duration_cast<chrono::minutes>(hours));
    cout << "1h=" << hours_to_minute.count() << "m" << endl;

    chrono::hours seconds_to_hours = chrono::duration_cast<chrono::hours>(seconds);
    cout << "3600s=" << seconds_to_hours.count() << "h" << endl;

    return 0;
}

输出结果:

1h=60m
3600s=1h

时间点time_point

时间点表示时间轴上的一个具体的时间,比如2018-6-19 19:00:00。
默认把1970-1-1 00:00:00当做时间轴的原点,那么我们就可以用一段时间来表示2018-6-19 19:00:00这个时间,那就是从原点到此时间经过的时间。可以使用不同的精度来表示这段时间,使用time_point_cast方法来进行精度的转换。time_since_epoch方法返回从原点到此时间的长度。
可以通过system_clock来获得当前时间点。

#include "stdafx.h"
#include <iostream>
#include <ratio>
#include <chrono>

using namespace std;

int main() {
    chrono::system_clock::time_point nowTp = chrono::system_clock::now();//当前时间点
    chrono::time_point<chrono::system_clock,chrono::hours> tpHours = chrono::time_point_cast<chrono::hours>(nowTp);//转化为小时为精度
    cout << "从1970年1月1日到现在经历了" << tpHours.time_since_epoch().count() << "小时"  << endl;

    typedef chrono::duration<int, ratio<3600 * 24>> day_type;
    chrono::time_point<chrono::system_clock, day_type> tpDays = chrono::time_point_cast<day_type>(nowTp);//转化为小时为精度
    cout << "从1970年1月1日到现在经历了" << tpDays.time_since_epoch().count() << "天" << endl;


    typedef chrono::duration<int, ratio<3600 * 24 * 365>> year_type;
    chrono::time_point<chrono::system_clock, year_type> tpYears = chrono::time_point_cast<year_type>(nowTp);//转化为小时为精度
    cout << "从1970年1月1日到现在经历了" << tpYears.time_since_epoch().count() << "年" << endl;
    return 0;
}

输出结果:

从1970年1月1日到现在经历了424835小时
从1970年1月1日到现在经历了17701天
从1970年1月1日到现在经历了48年
时间点和time_t,tm之间的转换
#include <iostream>
#include <ratio>
#include <chrono>
#include <ctime>

using namespace std;

int main() {
    chrono::system_clock::time_point nowTp = chrono::system_clock::now();
    chrono::time_point<chrono::system_clock, chrono::seconds> tp = chrono::time_point_cast<chrono::seconds>(nowTp);
    cout << "from 1970-1-1:" << tp.time_since_epoch().count() << "s" << endl;
    //to_time_t方法把时间点转化为time_t
    time_t tt = chrono::system_clock::to_time_t(tp);
    //使用ctime转化为字符串
    cout << ctime(&tt);
    //把time_t转化为tm
    tm *localTm =  localtime(&tt);
    cout << "year=" << localTm->tm_year << endl;
    cout << "month=" << localTm->tm_mon << endl;
    cout << "day=" << localTm->tm_mday << endl;
    cout << "hour=" << localTm->tm_hour << endl;
    cout << "minute=" << localTm->tm_min << endl;
    cout << "second=" << localTm->tm_sec << endl;
    //tm格式化输出
    char buffer[20];
    char format[] = "%Y-%m-%d %H:%M:%S";
    strftime(buffer, sizeof(buffer), format, localTm);
    cout << buffer << std::endl;

    //字符串转tm
    int year, month, day, hour, minute, second;// 定义时间的各个int临时变量。
    sscanf(buffer, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
    std::tm timeinfo = std::tm();
    timeinfo.tm_year = year - 1900;   // year: 2000
    timeinfo.tm_mon = month - 1;      // month: january
    timeinfo.tm_mday = day;     // day: 1st

    timeinfo.tm_hour = hour;
    timeinfo.tm_min = minute;
    timeinfo.tm_sec = second;
    timeinfo.tm_isdst = 0;

    //tm转time_t
    time_t tt1 = mktime(&timeinfo);
    //time_t转时间点
    chrono::system_clock::time_point tttp = chrono::system_clock::from_time_t(tt1);
    chrono::time_point<chrono::system_clock, chrono::seconds> tps = chrono::time_point_cast<chrono::seconds>(tttp);
    cout << "from 1970-1-1:" << tp.time_since_epoch().count() << "s" << endl;
    return 0;
}

输出结果:

from 1970-1-1:1529467131s
Wed Jun 20 11:58:51 2018
year=118
month=5
day=20
hour=11
minute=58
second=51
2018-06-20 11:58:51
from 1970-1-1:1529467131s
时间点与时间戳的转换
#include <iostream>
#include <ratio>
#include <chrono>
#include <ctime>

using namespace std;

int main() {
    chrono::system_clock::time_point nowTp = chrono::system_clock::now();
    chrono::time_point<chrono::system_clock, chrono::milliseconds> milliTp = chrono::time_point_cast<chrono::milliseconds>(nowTp);

    long long millis = milliTp.time_since_epoch().count();
    cout << millis << endl;

    chrono::milliseconds nMillis(millis);
    chrono::time_point<chrono::system_clock, chrono::milliseconds> nmilliTp(nMillis);
    cout << nmilliTp.time_since_epoch().count() << endl;
    return 0;
}

输出结果:

1529468562248
1529468562248
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值