当前位置: 首页 > >

C/C++ time处理及其相互转换

发布时间:

C 的时间
time_point

时间单位默认是秒,绝对时间获取的时间点都是相对新纪元。相关概念:


新纪元:1970年1月1日00:00:00 UTC(GMT)


#include

typedef long time_t //时间点,秒单位

time_t time(time_t *t) //返回自从新纪元以来流逝的秒数,将当前时间点写入到t


/***************************/
// 少用
#include

struct timeval {
time_t tv_sec; // 秒
susenconds_t tv_usec; // 微秒
}

int gettimeofday(struct timeval *tv,
struct timezone *tz);


/***************************/
// 常用
#include

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

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库的在c++里表示为。c++版本封装了不同单位的时间功能,忽略了获取的时间是秒、还是微秒抑或是纳秒的概念


分为三个模块


Durations

默认是秒:


typedef std::chrono::duration seconds_type;
typedef std::chrono::duration milliseconds_type;
typedef std::chrono::duration> hours_type;

std::chrono::seconds
std::chrono::milliseconds


std::chrono::hours = typedef duration> hours;
std::chrono::minutes = typedef duration> minutes;
std::chrono::seconds = typedef duration> seconds;
std::chrono::milliseconds = typedef duration> milliseconds;
std::chrono::microseconds = typedef duration> microseconds;
std::chrono::nanoseconds = typedef duration> nanoseconds;

不同单位的转换? std::chrono::duration_cast,例子


std::chrono::seconds s = std::chrono::duration_cast (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,自然没有影响


?



友情链接: