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> 

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

  1. c语言标准库详解(十二):非局部跳转setjmp.h

    c语言标准库详解(十二):非局部跳转<setjmp.h> 概述 头文件<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个深层嵌 ...

  2. c语言标准库详解(十五):limits.h与float.h

    c语言标准库详解(十五):<limits.h>与<float.h> 概述 <limits.h> 头文件<limits.h>定义了一些表示整型大小的常量. ...

  3. c语言标准库详解(八):数学公式math.h

    c语言标准库详解(八):数学公式<math.h> 概述 头文件<math.h>中声明了一些数学函数和宏. 宏 EDOM 和 ERANGE(在头文件<error.h> ...

  4. c语言标准库详解(十一):可变参数表stdarg.h

    c语言标准库详解(十一):可变参数表<stdarg.h> 概述 头文件<stdarg.h>提供了遍历未知数目的函数参数表的功能. 假定函数 f 带有可变数目的实际参数,last ...

  5. c语言标准库详解(七):字符串函数string.h

    c语言标准库详解(七):字符串函数<string.h> 头文件<string.h>中定义了两组字符串函数.第一组函数的名字以 str 开头:第二组函数的名字以 mem 开头.除 ...

  6. c语言标准库详解(零):总述

    c语言标准库详解(零):总述 关于标准库 标准库不是C语言本身的构成部分,但是支持标准C的实现会提供函数库中的函数声明.类型以及宏定义 标准库的内容 标准库中的函数.类型以及宏分别在下面的标准头文件中 ...

  7. Linux内核Thermal框架详解十四、Thermal Governor(4)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  8. STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

    写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library:一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube ...

  9. linux系统时间函数,Linux时间时区详解与常用时间函数

    时间与时区 整个地球分为二十四时区,每个时区都有自己的本地时间. UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT = UTC),格林威治时间和UTC时间都用秒数来计算的. ...

最新文章

  1. (转)编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
  2. 改来改去把微服务改成了分布式单体
  3. 文献学习(part51)--逼近理想点的主成分分析法及其应用
  4. 二叉树三种遍历(递归以及非递归实现)
  5. 程序设计与算法----递归之n皇后问题
  6. 【答辩问题】计算机专业本科毕业设计答辩自述
  7. 简化Simulink的建模与模型重构
  8. 用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
  9. 标准报表乱码出现??符号
  10. 基于ABBYY SDK 实现java版本 Hello 功能!
  11. wps里面函数怎么使用_WPS表格中常用文本函数的用法
  12. 预装WIN8的电脑是GPT分区模式,无法安装WIN7
  13. 计算机课word实验总结,大学计算机操作实践报告【实验8】Word2010综合实验
  14. 外企人常使用的工作邮箱,建议收藏!
  15. 用python爬取中国土地市场网上的土地出让公告所有标题
  16. 将idea初学者配置_初学者怪胎:如何将ISO映像刻录到光盘
  17. Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection brok
  18. 【问题记录】ImportError: DLL load failed while importing _imaging: 找不到指定的模块
  19. [云原生专题-12]:容器 - Ubuntu/CentOS平台没有ifconfig/ping工具的解决办法
  20. Kubectl基础命令

热门文章

  1. Halcon工具之轮廓线
  2. Python可视化35|matplotlibseaborn-一些有用的图
  3. 扬州大学微型计算机控制技术期末考试,计算机控制技术
  4. C++:opencv 人脸检测
  5. keil5函数 默认返回值_python学习第12天----内置函数 - 我想对你说
  6. 【whistle配置eruda代理】生产环境在线接入eruda查看network注意事项
  7. 网页复制不了?右击不了?大威天龙!Java锋哥来出招!
  8. matlab paillier加密_叶胜超:一分钟了解Paillier同态加密算法以及经典应用(118)...
  9. 在Excel中固定行标题和列标题
  10. 火柴摆出最大数字c语言,C语言火柴编程题