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 评论