时间精度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