首页 > 技术文章 > 时间类型

cfans1993 2017-02-16 00:29 原文

时间有关的数据类型

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;
}

推荐阅读