C语言与时间库
#include<time.h>
一、3种时间类型
1.time_t
time_t实际上是长整数类型
定义为:
typedef long time_t;
此类型通常用来表示:从1970年1月1日00:00:00到当前时刻的秒数。
2.timeval
timeval是一个结构体
定义为:
struct timeval{
_time_t tv_sec; //秒
_susenconds_t tv_usec; //微秒
};
其中,tv_sec为Epoch(1970-1-1零点零分)到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。
3.tm
tm是一个结构体
定义为:
struct tm{
int tm_sec; /*代表目前秒数,正常范围为0-59,但允许至61秒 */
int tm_min; /*代表目前分数,范围0-59*/
int tm_hour; /* 从午夜算起的时数,范围为0-23 */
int tm_mday; /* 目前月份的日数,范围01-31 */
int tm_mon; /*代表目前月份,从一月算起,范围从0-11 */
int tm_year; /*从1900 年算起至今的年数*/
int tm_wday; /* 一星期的日数,从星期一算起,范围为0-6。*/
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /*日光节约时间的旗标DST. [-1/0/1]*/
};
二、常见时间操作函数
1.time()
原 型:
time_t time(time_t * timer)
功能:获得当前系统时间,返回time_t类型
两种使用方式:
(1)
t1=time(NULL);
t1=time(0);//两种写法等价,将空指针传递给time()函数,并将time()返回值赋给变量t1
(2)
time(&t2);//将变量t2的地址作为实参传递给time()函数,函数自动把结果传递给t2,不需要额外的赋值语句。
2.gmtime()
原 型:
struct tm *gmtime(long *clock);
功能:把time_t类型转换成struct tm,此函数返回的时间未经时区转换,是UTC时间,返回的结构体tm代表目前UTC时间。(UTC时间:协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。)
使用举例:
time_t t=time(0);
gmtime(&t);//返回tm*类型
3.localtime()
原型:
struct tm *localtime(const time_t *clock);
功能:把time_t类型转换成struct tm,此函数返回的时间经过时区转换,是本地时间((我们是+8区,比UTC多8个小时)),比如,返回的结构体tm代表目前本地时间。
使用举例:
time_t t=time(0);
localtime(&t);//返回tm*类型
4.asctime()
原型:
char *asctime(const struct tm *tblock);
功能:转换日期和时间为相应的字符串(英文简写形式,形如:Mon Feb 16 11:29:26 2009)。
使用举例:
time_t t=time(0);
char* str1,*str2;
str1=asctime(gmtime(&t));//使用gmtime()获得tm*
str2=asctime(localtime(&t));//使用localtime()获得tm*
//两个字符串内容相同
//输出字符串时自带换行
5.ctime()
原型:
char *ctime(const time_t *time);
功能:把日期和时间转换为字符串。(英文简写形式,形如:Mon Feb 16 11:29:26 2009)ctime同asctime的区别在于,ctime是通过time_t来生成时间字符串,而asctime是通过tm结构来生成时间字符串。
使用举例:
time_t t=time(0);
char* str1;
str1=ctime(&t);
//与asctime()获得的字符串内容相同
//输出字符串时自带换行
6.mktime()
原型:
time_t mktime(strcut tm * timeptr);
功能:将tm时间结构数据转换成time_t。
使用举例:
time_t t1=time(0),t2;
struct tm* timer;
timer=gmtime(&t1);//使用gmtime()获得tm*
t2=mktime(timer);//t1与t2大小稍有不同
7.difftime()
原型:
double difftime(time_t time1, time_t time0);
功能:计算时间间隔长度,以秒为单位,且只能精确到秒。虽然该函数返回值是double类型的,但这并不说明该时间间隔具有同double一样的精度,这是由它的参数决定的。
使用举例:
#include<windows.h>
time_t t1=time(0);
Sleep(5000);//Sleep()函数的单位是毫秒,此条代码的意思是程序停止5秒,函数声明在windows.h中
time_t t2=time(0);
double dt=difftime(t2,t1);//计算两时间之差,单位是秒
8.strftime()
原型:
size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);
/*
参数解释:
strDest是字符指针,用来存放时间转化之后的字符串
maxsize是strDest中能够存放字符的最大个数
format是格式控制字符串
timeptr是struct tm类型的指针类型,用来指向需要转变的时间变量(struct tm类型)
返回值:该函数返回向strDest指向的字符串中放置的字符数。
*/
/*
格式控制命令
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十进制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
*/
功能:将时间格式化,或者说:格式化一个时间字符串。我们可以使用strftime()函数将时间格式化为我们想要的格式。
使用举例:
time_t t=time(0);
char* str1;
str1=(char*)malloc(30*sizeof(char));
strftime(str1,30,"%Y-%m-%d %H:%M:%S",gmtime(&t));//使用gmtime()获得tm*,str1存储着经过格式化的字符串