@perkyoung
2015-11-28T14:51:58.000000Z
字数 3617
阅读 2272
UNIX_API
今天学习了一些linux关于时间的函数,还有几个关于文件的时间函数,比如utimes,lutimes,futimes等,不在今天讨论的范围之内。
关于时间的函数,可以进行如下分类
char * ctime(time_t*);char* ctime_r(time_t*, char* buf);char* asctime(struct tm*);char* asctime(struct tm*, char* buf);
struct tm * = gmtime(time_t*);struct tm* = gmtime_r(time_t*, struct tm* result);struct tm* = localtime(time_t*);struct tm* = localtime_r(time_t*, struct tm* result);
time_t mktime(struct tm *);
int gettimeofday(struct timeval * __restrict, void * __restrict);
综上所述,平时常用的就是
ctime_r,asctime_rlocaltime_r,不推荐gmtime_r,因为后者不区分时区;mktimegettimeofday,通过参数返回结果,有timeval,timezone
#include <iostream>#include <time.h>#include <sys/time.h>using namespace std;/** ctime(),*/int main(){//ctime(const time_t* ),传入一个时间戳,返回一个时间的字符串.但是这个是分时区的,如果传入的//是0,那结果就是 Thu Jan 1 08:00:00 1970time_t a = 100;char * p = ctime(&a);cout << "ctime:" << endl;cout << "time is " << p << " a is " << a << endl;//char *//ctime_r(const time_t *clock, char *buf);提供和上面同样的功能,但是结果可以存储在用户提供的buf中//因为,返回的是一个志向static内存区域的指针,这个区域可能会被其他线程修改,这个buf起码要26个字符.char buf[26] = {0};char * p1 = ctime_r(&a, buf);cout << "time is " << buf << endl << endl;//gmtime(const time_t* ),传入时间戳,返回的是一个tm的结构,年份是距离1900年的时间//如果传入0的话,year就是70.struct tm* ret = gmtime(&a);cout << "gmtime: " << endl;cout << "year is " << ret->tm_year << endl;cout << "tm_sec is " << ret->tm_sec << endl;cout << "tm_wday is " << ret->tm_wday << endl;//同样,也有多线程的版本,gmtime(time_t *, tm* );struct tm result;gmtime_r(&a, &result);cout << "year is " << result.tm_year << endl;cout << "hour is " << result.tm_hour << endl;cout << "min is " << result.tm_min << endl;cout << "sec is " << result.tm_sec << endl<< endl;//localtime,目测localtime和gmtime用法是一样一样的.但是和gmtime不同的是:区分时区,gmtime返回的是0点,localtime返回的是8点.//所以一般情况下,我们使用的是localtime/localtime_r.ret = localtime(&a);cout << "localtime:" << endl;cout << "year is " << ret->tm_year << endl;cout << "tm_sec is " << ret->tm_sec << endl;cout << "tm_wday is " << ret->tm_wday << endl;//同样有多线程的版本ret = localtime_r(&a, &result);cout << "year is " << result.tm_year << endl;cout << "hour is " << result.tm_hour << endl;cout << "min is " << result.tm_min << endl;cout << "sec is " << result.tm_sec << endl<<endl;//asctime是传入的是tm的结构,根据tm结构中的数据,最终返回一个字符串,//同时提供多线程安全的版本,多传入一个buf,会写到这个buf中.result.tm_sec = 55;char * tmp = asctime(&result);cout << "asctime:" << endl;cout << "ret is " << tmp;cout << "year is " << result.tm_year << endl;cout << "hour is " << result.tm_hour << endl;cout << "min is " << result.tm_min << endl;cout << "sec is " << result.tm_sec << endl;char asctime_buf[26];result.tm_year = 80;tmp = asctime_r(&result, asctime_buf);cout << "ret is " << asctime_buf;cout << "year is " << result.tm_year << endl;cout << "hour is " << result.tm_hour << endl;cout << "min is " << result.tm_min << endl;cout << "sec is " << result.tm_sec << endl<<endl;//difftime顾名思义就是时间差,传入的是time_t类型的数据.time_t start = 1222;time_t end = 1111;double diffret = difftime(start,end);cout << "difftime:" << endl;cout << "diff is " << diffret << endl;//mktime顾名思义就是生成time_t 时间戳,这是穿进去的数字是根据自己当前的时区的.struct tm mktime_tm;mktime_tm.tm_year = 101;mktime_tm.tm_hour = 3;time_t mktime_ret = mktime(&mktime_tm);cout << "ret is " << mktime_ret << endl;struct tm* aaa = gmtime(&mktime_ret);cout << "hour is " << aaa->tm_hour << endl;aaa = localtime(&mktime_ret);cout << "hour is " << aaa->tm_hour << endl;//最特别的一个,gettimeofday,传递的参数都不同.timeval类型的参数//#include <sys/time.h>timeval timeofday_a;struct timezone timeofzone_a;gettimeofday(&timeofday_a, &timeofzone_a);cout << "timeofday is " << timeofday_a.tv_sec << endl;cout << "time zone is " << timeofzone_a.tz_dsttime << endl;cout << "time zone is " << timeofzone_a.tz_minuteswest << endl;//相同功能的函数就是time(time_t*);return 0;}