注:最好将<time.h>和<sys/time.h>都引入
1、类型声明与结构体声明:
(1)typedef long time_t;
time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。
UTC时间有时也称为GMT时间,其实UTC和GMT两者几乎是同一概念。它们都是指格林尼治标准时间,只不过UTC的称呼更为正式一点。两者区别在于前者是天文上的概念,而后者是基于一个原子钟。
time_t记录一个日历时间。日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
(2)struct tm
struct tm { int tm_sec; /* Seconds. [0-59]*/ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 其值为1900年至今年数 */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/ long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/ const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/ };
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。
(3)struct timeval
struct timeval { time_t tv_sec; /* Seconds. */ suseconds_t tv_usec; /* Microseconds. */ }; //suseconds_t实质上是long类型
(4)struct timespec
struct timespec { time_t tv_sec; /* Seconds. */ long int tv_nsec; /* Nanoseconds. */ };
2、time_t time(time_t * timer)
(1)说明
该函数返回从1970年1月1日00时00分00秒至今(本地时间)所经过的秒数。如果time_t *timer非空指针,函数也会将返回值存到timer指针指向的内存。
(2)返回值
成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
(3)亮点
在生成随机数时,通常用该函数生成种子。
(4)对以下函数的总括:
1)ctime和asctime只是将时间转换为字符串类型,不用考虑本地时间或是GMT。
2)gmtime和localtime返回的指针指向的是同一个地址,如果先后调用两个函数,先调用的函数返回的指针指向的地址会被后调用的函数覆盖掉,此时如果同时输出二者返回的数据,会发现数据完全一样,因此,应该调用某个函数后立即处理。
ctime和asctime也存在上述情况,所以应该即时打印或保存。
3)gmtime和localtime都默认把参数当作本地时间。
4)mktime是将本地时间转换为本地时间,GMT时间转换为GMT时间。
3、char *ctime(const time_t *time);
(1)说明
ctime( )将参数time 指向的time_t时间信息转换成实际所使用的时间日期表示方法,并以字符串形式返回。字符串格式为:"Wed Jun 20 21:00:00 2012\n"。
(2)linux下使用时应如下:
(char *)ctime(&time) ,即要将返回值进行类型转换,还有很多函数也需要这样做。
4、struct tm *gmtime(const time_t *timep)
(1)说明
gmtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的GMT时间信息,并以struct tm*指针返回。
5、struct tm *localtime(const time_t *timep);
(1)说明
localtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的本地时区时间。
6、time_t mktime(struct tm *p_tm);
(1)说明
mktime( )将参数p_tm指向的tm结构体数据转换成对应的time_t类型的数据。发生错误时返回-1.
无论是本地时间还是GMT都可以进行转换。
7、char *asctime(const struct tm *p_tm);
(1)说明
asctime()将参数p_tm指向的tm结构体数据转换成实际使用的时间日期表示方法,并以字符串形式返回(与ctime函数相同)。字符串格式为:"Wed Jun 20 21:00:00 2012\n"。
8、double difftime(time_t timep1, time_t timep2);
(1)说明
返回两个time_t型变量之间的时间间隔,即计算两个时刻之间的时间差。它的实现是用timep1-timep2,因此可能是负值。
9、size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);
(1)说明
将时间格式化。
(2)参数和返回值
我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数,错误返回0。
格式命令列在下面,它们是区分大小写的:
- %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 时区名称,如果不能得到时区名称则返回空字符。
- %%百分号