C语言提供了日期和时间库,可以确定时间、对时间值进行算术操作以及显示格式化时间等。这些函数都在头文件
中声明,因此使用时需要包含该头文件。
时间处理函数包括以下几个函数:
clock_t clock(void);
time_t time(time_t *timer);
double difftime(time_t end, time_t beggining);
time_t mktime(struct tm *timeptr);
clock
函数返回处理器时间,表示从程序执行开始过去的时间。clock_t
类型用于表示时间区间。
中提供了宏CLOCKS_PER_SEC
将这个时间转换为秒。测量程序运行时间的惯用做法是调用两次clock
函数,一次在main
函数开始处,一次在程序要终止之前。将两个时刻的clock
返回值相减除以宏CLOCKS_PER_SEC
就可以获得程序运行时间(单位为秒)。
相对于clock_t
,time_t
包含完整的日期和时间信息且紧密编码,占用空间小,称为日历时间。time
函数返回当前的日历时间,如果实参不为空,该函数也会将当前时间存储在实参中。
difftime
函数返回两个日历时间end
和begging
之间的差值,以秒为单位。
struct tm
是存放时间和日期的结构体,称为分解时间,其成员如下表,都为int
类型:
名称 | 描述 | 最小值 | 最大值 |
---|---|---|---|
tm_sec |
秒 | 0 | 61(允许润秒) |
tm_min |
分 | 0 | 59 |
tm_hour |
小时 | 0 | 23 |
tm_mday |
每月的天 | 1 | 23 |
tm_mon |
从一月以后的月份 | 0 | 11 |
tm_year |
从1900以后的年份 | 0 | – |
tm_wday |
从星期日之后的天 | 0 | 6 |
tm_yday |
从一月一日之后的天 | 0 | 365 |
tm_isdst |
白天省时标记 | 正数表示有效,0表示无效,-1表示未知 | – |
mktime
函数将struct tm
类型的时间转换为日历时间,会自动调整其值输入参数struct tm
变量的不在合法范围内的任何成员。
/**************************************
* time_handlers.h *
* *
* C语言时间和日期库中的时间处理函数 *
**************************************/
#include
#include
int main()
{
clock_t startClock = clock();
time_t startTime = time(NULL);
int i;
int sum;
for(i = 0; i < 1000; i++)
sum += i;
clock_t endClock = clock();
time_t endTime = time(NULL);
printf("使用的处理器时间是: %g sec\n", (endClock - startClock)/(double)CLOCKS_PER_SEC);
printf("程序运行时间是: %g sec\n", difftime(endTime, startTime));
struct tm t;
t.tm_mday = 3;
t.tm_mon = 8;
t.tm_year = 115;
t.tm_sec = 0;
t.tm_min = 0;
t.tm_hour = 0;
t.tm_isdst = -1;
t.tm_mday += 31;
mktime(&t);
printf("2015年9月3号过31之后是%d年%d月%d号\n", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday);
return 0;
}
时间转换函数用以将日历函数转换为分解函数,将时间转换为字符串格式等,包括以下几个函数:
char *asctime(const tm *timeptr);
char *ctime(const time_t *timer);
struct tm *gmtime(const time_t *timer);
struct tm *localtime(const time_t *timer);
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);
asctime
函数根据函数参数指向的分解时间,返回指向类似Tue Aug 30 17:07:12 1994
的字符串的指针。字符串存储在静态变量中。ctime
函数返回描述本地时间的字符串。gmtime
返回用UTC(统一世界时间)显示的时间,localtime
函数产生本地时间。
strftime
函数将分解时间转换为格式化的字符串,且可以对时间格式进行控制。它会根据格式化字符串format
将字符写入字符串s中。最后一个参数为数据和时间信息源,第二个参数限制了存储在字符串s中的字符数量。格式化字符串使用的转换说明符:
转换说明符 | 替换内容 |
---|---|
%a |
缩写的星期名 |
%A |
完整的星期名 |
%b |
缩写的月份名 |
%B |
完整的月份名 |
%c |
完整的日期和时间 |
%d |
月内的天 |
%H |
24小时制的小时 |
%I |
12小时制的小时 |
%j |
年内的天 |
%m |
月份 |
%M |
分钟 |
%p |
AM/PM指示器 |
%S |
秒 |
%U |
星期数 |
%x |
完全的日期 |
%X |
完整的时间 |
%y |
不含世纪的年 |
%Y |
含有世纪的年 |
%Z |
时区名或缩写 |
/*******************************************
* date_time.c *
* *
* C语言时间日期库中的时间转换函数 *
* 例子引用自C语言程序设计-现代方法 *
*******************************************/
#include
#include
int main()
{
time_t current = time(NULL);
struct tm *ptr;
char date_time[19];
int hour;
char am_or_pm;
puts(ctime(¤t));
ptr = localtime(¤t);
puts(asctime(ptr));
strftime(date_time, sizeof(date_time), "%m-%d-%y %I:%M%p\n", ptr);
puts(date_time);
hour = ptr->tm_hour;
if (hour <= 11)
am_or_pm = 'a';
else
{
hour -= 12;
am_or_pm='p';
}
if (hour == 0)
hour = 12;
printf("%.2d-%.2d-%.2d %2d:%.2d%c\n", ptr->tm_mon + 1, ptr->tm_mday,
ptr->tm_year, hour, ptr->tm_min, am_or_pm);
ptr = gmtime(¤t);
puts(asctime(ptr));
return 0;
}