C 的时间
time_point
时间单位默认是秒,绝对时间获取的时间点都是相对新纪元。相关概念:
新纪元:1970年1月1日00:00:00 UTC(GMT)
#include <time.h>
typedef long time_t //时间点,秒单位
time_t time(time_t *t) //返回自从新纪元以来流逝的秒数,将当前时间点写入到t
/***************************/
// 少用
#include <sys/time.h>
struct timeval {
time_t tv_sec; // 秒
susenconds_t tv_usec; // 微秒
}
int gettimeofday(struct timeval *tv,
struct timezone *tz);
/***************************/
// 常用
#include <time.h>
struct timespec {
time_t tv_sec; // 秒
long tv_nsec; // 纳秒
}
int clock_gettime(clockid_t clock_id,
struct timespec *ts);
/***************************/
// 时间差
double difftime(time_t time1, time_t time0);
tm 是人们容易理解的时间格式
#include <time.h>
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday; /*该月的日期,0~31*/
int tm_mon; /*0~11*/
int tm_year; /*从1900年以来的年数*/
int tm_wday; /*从周日以来的天数 0~6*/
int tm_yday; /*从1月1日以来的日期数 0~356*/
int tm_isdst;
#ifdef _BSD_SOURCE
long tm_gmtoff;
const char *tm_zone;
#endif /* _BSD_SOURCE */
};
时间字符串表达:
char * asctime(const struct tm *tm); // tm -> str
char * ctime(const time_t *timep); // time_t -> str
struct tm * localtime(const time_t *timep); // time_t -> tm
time_t mktime(struct tm *tm); // tm -> time_t
C++
std::chrono是一个Time library,同时c库的<time.h>在c++里表示为<ctime>。c++版本封装了不同单位的时间功能,忽略了获取的时间是秒、还是微秒抑或是纳秒的概念
分为三个模块
Durations
默认是秒:
typedef std::chrono::duration<int> seconds_type;
typedef std::chrono::duration<int, std::milli> milliseconds_type;
typedef std::chrono::duration<int, std::ratio<60*60>> hours_type;
std::chrono::seconds
std::chrono::milliseconds
std::chrono::hours = typedef duration<int, ratio<3600, 1>> hours;
std::chrono::minutes = typedef duration<int, ratio<60, 1>> minutes;
std::chrono::seconds = typedef duration<int, ratio<1, 1>> seconds;
std::chrono::milliseconds = typedef duration<int, ratio<1, 1000>> milliseconds;
std::chrono::microseconds = typedef duration<int, ratio<1, 1000000>> microseconds;
std::chrono::nanoseconds = typedef duration<int, ratio<1, 1000000000>> nanoseconds;
不同单位的转换 std::chrono::duration_cast,例子
std::chrono::seconds s = std::chrono::duration_cast<std::chrono::seconds> (std::chrono::milliseconds ms);
将当前milliseconds转成seconds
c的time_t 为long 型,可以直接输出,而durations需要使用count()方法输出
Time points
std::chrono::system::clock::time_point today = std::chrono::system_clock::now();
time_t tt;
tt = system_clock::to_time_t ( today );
std::cout << "today is: " << ctime(&tt);
获取now()的epoch时间,epoch即从1970年1月1日00:00:00以来的格林尼治时间,需要注意这里的时区问题
std::chrono::system_clock::now().time_since_epoch()
Clocks
std::chrono::system_clock相当于C的CLOCK_REALTIME
std::chrono::steady_clock相当于C的CLOCK_MONOTONIC
std::chrono::high_resolution_clock 高精度版本,但是It may be a synonym for system_clock or steady_clock.[cplusplus.com]
三个static member functions
std::chrono::system_clock::now() // get current time
C++时间与C时间的转换
time_t std::chrono::system_clock::to_time_t(const time_point& tp);
time_point std::chrono::system_clock::from_time_t(time_t t)
UTC和CST的影响
time_since_epoch这个时间是获取从1970.1.1以来UTC的duration。 就是说如果该机子使用的是UTC时间,那么time_since_epoch就是UTC的duration,但是如果该机子使用了CST时间,那么time_since_epoch.count()的具体过程:先将CST推算出UTC时间,即CST - 8个时区,之后得到就是现在的UTC时间和1970.1.1的UTC时间的duration。为了避免同时区造成的影响,使用做差时间。本机用时间函数将1970.1.1转成time_point,再用get_now()与之做差得到duration,去掉了时区的影响。如果本机直接使用UTC时间,time_since_epoch也是UTC,两者单位都是UTC,自然没有影响