c语言标准库详解(十四):时间函数time.h

c语言标准库详解(十四):时间函数

概述

头文件中声明了一些处理日期与时间的类型和函数。其中的一些函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同。clock_t和time_t是两个表示时间的算数类型,struct tm用于保存日历时间的各个构成部分。

struct tm

结构tm中各成员的用途及取值范围如下所示:

成员名称 涵义
int tm_sec; 从当前分钟开始经过的秒数(0, 61)
int tm_min; 从当前小时开始经过的分钟数(0, 59)
int tm_hour; 从午夜开始经过的小时数(0, 23)
int tm_mday; 当月的天数(1, 31)
int tm_mon; 从 1 月起经过的月数(0, 11)
int tm_year; 从 1900 年起经过的年数
int tm_wday; 从星期天起经过的天数(0, 6)
int tm_yday; 从 1 月 1 日起经过的天数(0, 365)
int tm_isdst; 夏令时标记 (巨坑)

使用夏令时,tm_isdst的值为正,否则为0.如果该信息无效,则其值为负。

clock()函数

clock_t clock(void)

clock 函数返回程序开始执行后占用的处理器时间。如果无法获取处理器时间,则返回值为-1。clock()/CLOCKS_PER_SEC 是以秒为单位表示的时间。

time()函数

time_t time(time_t *tp)

time函数返回当前日历时间。如果无法获取日历时间,则返回值为-1。 如果tp不是NULL, 则同时将返回值赋给*tp。

difftime()函数

double difftime(time_t time2, time_t time1)

difftime 函数返回 time2-time1 的值(以秒为单位)。

mktime()函数

time_t mktime(struct tm *tp)

mktime 函数将结构*tp 中的当地时间转换为与 time 表示方式相同的日历时间,结构中各成员的值位于上面所示范围之内。mktime 函数返回转换后得到的日历时间;如果该时间不能表示,则返回-1。

下面 4 个函数返回指向可被其它调用覆盖的静态对象的指针。

asctime()

char *asctime(const struct tm *tp)

asctime函数将结构*tp中的时间转换为下列所示的字符串形式:
Sun Jan 3 15:14:13 1988\n\0

ctime()

char *ctime(const time_t *tp)

ctime 函数将结构*tp 中的日历时间转换为当地时间。它等价于下列函数调用:

asctime(localtime(tp))

gmtime()

struct tm *gmtime(const time_t *tp)

gmtime 函数将*tp 中的日历时间转换为协调世界时(UTC)。如果无法获取 UTC,则该函数返回 NULL。函数名字 gmtime 有一定的历史意义。

localtime()

struct tm *localtime(const time_t *tp)

localtime 函数将结构*tp 中的日历时间转换为当地时间。

strftime()函数

size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp)

strftime 函数根据 fmt 中的格式把结构*tp 中的日期与时间信息转换为指定的格式,并存储到 s 中,其中 fmt 类似于 printf 函数中的格式说明。普通字符(包括终结符’\0’)将复制到 s 中。每个%c 将按照下面描述的格式替换为与本地环境相适应的值。最多 smax 个字符写到 s 中。strftime 函数返回实际写到 s 中的字符数(不包括字符’\0’);如果字符数多于smax,该函数将返回值 0。
fmt 的转换说明及其含义如下所示:

模式 涵义
%a 一星期中各天的缩写名
%A 一星期中各天的全名
%b 缩写的月份名
%B 月份全名
%c 当地时间和日期表示
%d 一个月中的某一天(01-31)
%H 小时(24 小时表示)( 00-23)
%I 小时(12 小时表示)( 01-12)
%j 一年中的各天(001—366)
%m 月份(01-12)
%M 分钟(00-59)
%p 与 AM 与 PM 相应的当地时间等价表示方法
%S 秒(00-61)
%U 一年中的星期序号(00-53,将星期日看作是每周的第一天)
%w 一周中的各天(0-6,星期日为 0)
%W 一年中的星期序号(00-53,将星期一看作是每周的第一天)
%x 当地日期表示 %X 当地时间表示
%y 不带世纪数目的年份(00-99)
%Y 带世纪数目的年份
%Z 时区名(如果有的话)
%% %本身

示例

time()函数

代码:

#include 
#include 
int main ()
{
  time_t seconds;
  seconds = time(NULL);
  printf("自 1970-01-01 起的小时数 = %ld\n", seconds/3600); 
  return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-1fpkwzqc.3l4' '--stdout=Microsoft-MIEngine-Out-rgypw4hy.exq' '--stderr=Microsoft-MIEngine-Error-cvmhkdqs.3yo' '--pid=Microsoft-MIEngine-Pid-gbo51isq.oty' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
自 1970-01-01 起的小时数 = 441350
PS G:\CSAPP>

mktime()函数

代码:

#include       /* printf, scanf */
#include        /* time_t, struct tm, time, mktime */
int main ()
{
    time_t rawtime;
    struct tm * timeinfo;
    int year, month ,day;
    const char * weekday[] = { "周日", "周一","周二", "周三","周四", "周五", "周六"};
    /* 用户输入日期 */
    printf ("年: "); fflush(stdout); scanf ("%d",&year);
    printf ("月: "); fflush(stdout); scanf ("%d",&month);
    printf ("日: "); fflush(stdout); scanf ("%d",&day);
    /* 获取当前时间信息,并修改用户输入的输入信息 */
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    timeinfo->tm_year = year - 1900;
    timeinfo->tm_mon = month - 1;
    timeinfo->tm_mday = day;
    /* 调用 mktime: timeinfo->tm_wday  */
    mktime ( timeinfo );
    printf ("那一天是:%s\n", weekday[timeinfo->tm_wday]);
    return 0;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-hs1wftpx.ln1' '--stdout=Microsoft-MIEngine-Out-fwpne1rj.vso' '--stderr=Microsoft-MIEngine-Error-emg4z14w.3oo' '--pid=Microsoft-MIEngine-Pid-1qlw2j4y.5ki' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
年: 1919
月: 8
日: 10
那一天是:周四
PS G:\CSAPP>

asctime()函数

代码:

#include 
#include 
#include 
int main()
{
   struct tm t;
   t.tm_sec    = 10;
   t.tm_min    = 10;
   t.tm_hour   = 6;
   t.tm_mday   = 25;
   t.tm_mon    = 2;
   t.tm_year   = 89;
   t.tm_wday   = 6;
   puts(asctime(&t));  
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-j4vkw4tt.gfk' '--stdout=Microsoft-MIEngine-Out-40wpjdv3.tws' '--stderr=Microsoft-MIEngine-Error-bxob5we5.igw' '--pid=Microsoft-MIEngine-Pid-wr3pqp14.m0m' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
Sat Mar 25 06:10:10 1989

PS G:\CSAPP> 

注意:以上代码在Visual Studio中会报错,建议在vs code上配合MinGW使用

clock()函数

代码:

#include 
#include 
int main()
{
   clock_t start_t, end_t;
   double total_t;
   int i;
   start_t = clock();
   printf("程序启动,start_t = %ld\n", start_t);
   printf("开始一个大循环,start_t = %ld\n", start_t);
   for(i=0; i< 10000000; i++)
   {
   }
   end_t = clock();
   printf("大循环结束,end_t = %ld\n", end_t);
   total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
   printf("CPU 占用的总时间:%f\n", total_t  );
   printf("程序退出...\n");
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-ejz5bknr.jgc' '--stdout=Microsoft-MIEngine-Out-mjuwamom.pro' '--stderr=Microsoft-MIEngine-Error-o4f1uase.bul' '--pid=Microsoft-MIEngine-Pid-tp4j4yim.cvp' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
程序启动,start_t = 103
开始一个大循环,start_t = 103
大循环结束,end_t = 121
CPU 占用的总时间:0.018000
程序退出...
PS G:\CSAPP> 

ctime()函数

代码:

#include 
#include 
int main ()
{
   time_t curtime;
   time(&curtime);
   printf("当前时间 = %s", ctime(&curtime));
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-pentcl00.h5j' '--stdout=Microsoft-MIEngine-Out-5xgbuim5.vis' '--stderr=Microsoft-MIEngine-Error-xjkllr0g.cah' '--pid=Microsoft-MIEngine-Pid-hu5khluv.d4h' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
当前时间 = Thu May 07 22:16:09 2020
PS G:\CSAPP> 

difftime()函数

代码:

#include 
#include 
#ifdef _WIN32
#include 
#else
#include 
#endif
int main ()
{
   time_t start_t, end_t;
   double diff_t;
   printf("程序启动...\n");
   time(&start_t);
   printf("休眠 5 秒...\n");
   sleep(5);
   time(&end_t);
   diff_t = difftime(end_t, start_t);
   printf("执行时间 = %f\n", diff_t);
   printf("程序退出...\n");
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-0rrwluwb.4i2' '--stdout=Microsoft-MIEngine-Out-la4xa3ro.iey' '--stderr=Microsoft-MIEngine-Error-0jneghrd.av2' '--pid=Microsoft-MIEngine-Pid-s5wixl4e.ovt' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
程序启动...
休眠 5 秒...
执行时间 = 5.000000
程序退出...
PS G:\CSAPP>

gmtime()函数

代码:

#include 
#include 
#define BST (+1)
#define CCT (+8)
int main ()
{
   time_t rawtime;
   struct tm *info;
   time(&rawtime);
   /* 获取 GMT 时间 */
   info = gmtime(&rawtime );
   printf("当前的世界时钟:\n");
   printf("伦敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
   printf("中国:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-exrvrf34.gje' '--stdout=Microsoft-MIEngine-Out-cgkj5jn2.loc' '--stderr=Microsoft-MIEngine-Error-ag55ldxw.am0' '--pid=Microsoft-MIEngine-Pid-mzg5zuh1.rjq' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
当前的世界时钟:
伦敦:15:22
中国:22:22
PS G:\CSAPP>

localtime()函数

代码:

#include 
#include 
int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];
   time( &rawtime );
   info = localtime( &rawtime );
   printf("当前的本地时间和日期:%s", asctime(info));
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-kxapw3uq.dya' '--stdout=Microsoft-MIEngine-Out-wbzweb43.wx1' '--stderr=Microsoft-MIEngine-Error-qzxo1myz.10c' '--pid=Microsoft-MIEngine-Pid-wpacgfjx.cpc' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
当前的本地时间和日期:Thu May 07 22:24:36 2020
PS G:\CSAPP>

strftime()函数

代码:

#include 
#include 
int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];
   time( &rawtime );
   info = localtime( &rawtime );
   strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
   printf("格式化的日期 & 时间 : |%s|\n", buffer ); 
   return(0);
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-lua0n3oy.dh5' '--stdout=Microsoft-MIEngine-Out-fz2ay10m.kam' '--stderr=Microsoft-MIEngine-Error-wazcemfh.fgg' '--pid=Microsoft-MIEngine-Pid-m3cu3u0n.lj1' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi' 
格式化的日期 & 时间 : |2020-05-07 22:34:27|
PS G:\CSAPP> 

你可能感兴趣的:(c语言)