C语言的日期和时间库

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_ttime_t包含完整的日期和时间信息且紧密编码,占用空间小,称为日历时间。time函数返回当前的日历时间,如果实参不为空,该函数也会将当前时间存储在实参中。

difftime函数返回两个日历时间endbegging之间的差值,以秒为单位。

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

C语言的日期和时间库_第1张图片

参考文献

  1. K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社

你可能感兴趣的:(C语言,c语言,时间日期函数)