@perkyoung
2015-11-28T14:51:58.000000Z
字数 3617
阅读 2066
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_r
localtime_r
,不推荐gmtime_r
,因为后者不区分时区;mktime
gettimeofday
,通过参数返回结果,有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 1970
time_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;
}