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

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

概述

头文件<time.h>中声明了一些处理日期与时间的类型和函数。其中的一些函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同。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 <stdio.h>
#include <time.h>
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 <stdio.h>      /* printf, scanf */
#include <time.h>       /* 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 <stdio.h>
#include <string.h>
#include <time.h>
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 1989PS G:\CSAPP> 

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

clock()函数

代码:

#include <time.h>
#include <stdio.h>
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 <stdio.h>
#include <time.h>
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 <stdio.h>
#include <time.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#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 <stdio.h>
#include <time.h>
#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 <stdio.h>
#include <time.h>
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 <stdio.h>
#include <time.h>
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> 

本文链接:https://my.lmcjl.com/post/10971.html

展开阅读全文

4 评论

留下您的评论.