时间类型
时间有关的数据类型
time_t: long类型, 记录从1970年1月1日0时0分0秒到现在经过的秒数,在32位的long类型平台上2038年时间溢出
struct tm: 符合人类习惯的记录方式
struct tm{
int tm_sec // seconds after the minute 0-61
int tm_min // minutes after the hour 0-59
int tm_hour // hours since midnight 0-23
int tm_mday // day of the month 1-31
int tm_mon // months since January 0-11
int tm_year // years since 1900
int tm_wday // days since Sunday 0-6
int tm_yday // days since January 1 0-365
int tm_isdst // Daylight Saving Time flag
}
相关函数的重要区别
ctime(time_t *p):与asctime(localtime(time_t *))效果等同,转换成当地时间的字符串表示形式
gmtime(time_t *p): 返回成如上的struct tm时间结构.asctime(gmtime(time_t *p))转换成世界统一时间的字符串表示形式
即两者之间存在一个时间差,一个以当地时间为准,一个以格林尼治时间为准
时间相加减
时间相加减要以time_t格式进行操作, 不要用tm结构的成员进行加减
#include <stdio.h>
#include <time.h>
void test(){ //以当前时间为准简单加减
time_t tmp_time;
struct tm *ptime;
struct tm *tmp;
tmp_time = time(NULL);//获取当前时间
ptime = localtime(&tmp_time);
printf("%d-%d-%d %d:%d:%d\n",(1900+ptime->tm_year),(1+ptime->tm_mon),ptime->tm_mday,\
ptime->tm_hour,ptime->tm_min,ptime->tm_sec);
//时间相加减要用time_t格式
tmp_time -= 30*60;
tmp = localtime(&tmp_time);
printf("%d-%d-%d %d:%d:%d\n",(1900+tmp->tm_year),(1+tmp->tm_mon),tmp->tm_mday,\
tmp->tm_hour,tmp->tm_min,tmp->tm_sec);
//时间相加减的差误示范
ptime->tm_hour += 24;
printf("%d-%d-%d %d:%d:%d\n",(1900+ptime->tm_year),(1+ptime->tm_mon),ptime->tm_mday,\
ptime->tm_hour,ptime->tm_min,ptime->tm_sec);
}
void test1(){//构造15:30:00,然后减掉5分19秒
time_t now=time(NULL);
struct tm *ptime=localtime(&now);
ptime->tm_hour=15;
ptime->tm_min=30;
ptime->tm_sec=0;
time_t ret=mktime(ptime);
ret=ret-5*50-19;
struct tm *ret_ptime=localtime(&ret);
printf("%d:%d:%d\n",ret_ptime->tm_hour,ret_ptime->tm_min,ret_ptime->tm_sec);
}
int main(int argc, const char *argv[])
{
test();
test1();
return 0;
}