1、C语言的标准库函数
C语言标准库函数中包括很多函数,像string.h, stdio.h这些大家使用的最多,比如strcpy, printf, sprintf这些函数都是这些库函数提供的。C语言标准库函数一共包括以下文件。
1.1 assert.h 文件
assert.h库函数提供了一个称为assert的宏,该宏可用于验证程序所作的假设并在此假设为假时打印诊断消息。定义的宏断言引用另一个宏NDEBUG,它不是<assert.h>的一部分。如果将NDEBUG定义为源文件中的宏名称,则在包含<assert.h>的点处,assert宏的定义如下#define assert(ignore) ((void)0)
1.2 ctype.h 文件
C标准库的ctype.h头文件声明了一些对测试和映射字符有用的函数。所有函数均接受int作为参数,其值必须为EOF或可表示为无符号字符。如果参数c满足所描述的条件,则所有函数均返回非零(true),否则返回零(false)。
1.3 errno.h 文件
C标准库的errno.h头文件定义了int变量errno,该整数变量由系统调用和某些库函数在发生错误的情况下设置,以指示出问题所在。该宏扩展为int类型的可修改左值,因此可以被程序读取和修改。程序启动时将errno设置为零。标准C库的某些函数会将其值修改为非零值,以表示某些类型的错误。您还可以方便地修改其值或将其重置为零。errno.h头文件中还定义指示不同的错误代码,这将扩大到与类型整数常量表达式宏的列表。
1.4 float.h 文件
C标准库的float.h头文件包含一组与浮点值相关的各种平台相关的常数。这些常量由ANSI C提出。它们允许制作更多可移植的程序。在检查所有常量之前,最好了解浮点数由以下四个元素组成。
1.5 limits.h文件
limits.h中报头确定的各种变量类型的各种属性。此标头中定义的宏限制了各种变量类型(例如char,int和long)的值。这些限制指定变量不能存储超出这些限制的任何值,例如,unsigned char最多可以存储255。
1.6 locale.h 文件
locale.h定义了位置特定的设置,如日期格式和货币符号。您将找到几个定义的宏,以及一个重要的结构struct lconv和下面列出的两个重要函数。
1.7 math.h 文件
math.h定义了各种数学函数和一个宏。该库中所有可用的函数都将double作为参数,并返回double作为结果。
1.8 setjmp.h 文件
setjmp.h定义了宏setjmp()、一个函数longjmp()和一个变量类型jmp_buf,用于绕过正常的函数调用和返回规则。
1.9 signal.h 文件
signal.h定义的变量类型sig_atomic_t,两个函数调用,和多个宏处理程序的执行过程中报告不同的信号。
1.10 stdarg.h 文件
stdarg.h定义的变量类型va_list的并且可以被用于获取在参数时的参数的数目是不知道的参数即变量数的函数三个宏。变量参数的函数在参数列表的末尾用省略号(,...)定义。
1.11 stddef.h 文件
stddef.h定义了各种变量类型和宏。其中许多定义也出现在其他头文件中。
1.12 stdio.h 文件
stdio.h定义了三个变量类型,若干宏,和用于执行输入和输出的各种函数。
1.13 stdlib.h 文件
stdlib.h定义了四个变量类型,若干宏,和各种函数。
1.14 string.h 文件
string.h定义了一个变量类型,一个宏,以及用于操纵字符数组的各种函数。
1.15 time.h 文件
time.h定义了四个变量类型,两个宏信息和各种函数用于操纵日期和时间。这个文件就是本博文介绍的重点。
以上的库函数的文件的介绍引用自https://www.jc2182.com/c/c-time.html
2 time.h文件中的时间相关函数
time.h中的时间的函数比较多,并且好几个函数都是做不同的格式的时间的转换,如果不对整个函数有一个整体的认识,初次学习很难掌握这些时间相关函数的功能。为了方便了解清楚time.h中相关的函数的功能,今天特别画了一张图的来说明这些函数之间的相关关系,咱们今天是图说time.h。首先要了解关于时间的几个名词,概念。
GMT 的全名是格林威治标准时间或格林威治平时 (Greenwich Mean Time),这个时间系统的概念在 1884 年确立,由英国伦敦的格林威治皇家天文台计算并维护,并在往后的几十年往欧陆其他国家扩散。在 1924 年开始,格林威治天文台每小时就会向全世界播报时间。
在刚开始的几十年,GMT 的测量方法非常简单:观测者随时监控太阳在天空的位置,并且把每天太阳爬升到仰角最高的时候记录下来,这个时间点称呼为“过中天”。一般人对于一天 24 小时的理解,大致上就相等于两次太阳过中天的时间间隔。不过由于地球是以椭圆轨道绕着太阳,在轨道上的行进速率不一,导致一年之中会有“比较长的一天”与“比较短的一天”,所以格林威治的观测者必须要至少连续观测一年,然后求取 365 个长度不一的“天”,再把他们全部平均后,得到固定的一天长度,之后再细分成时、分、秒等单位。这个就是 GMT。
GMT 12:00 就是指的是英国伦敦郊区的皇家格林尼治天文台当地的中午12:00,而GMT+8 12:00,则是指的东八区的北京当地时间的12:00
UTC协调世界时,又称世界统一时间、世界标准时间、国际协调时间。协调世界时,即以我为基准,向我看齐的意思。(英语:Coordinated Universal Time,法语:Temps Universel Coordonné,简称UTC)是最主要的世界时间标准,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。UTC + 时区差 = 本地时间。
夏时制,另译夏令时间(英语:Summer time),又称日光节约时制、日光节约时间(英语:Daylight saving time),是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮较早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
比如,小惠所在的地方冬天时太阳七点钟升起,她每天早上七点钟起床,一天在书房学习十二个小时,晚上七点睡觉。而到了夏天太阳变成六点升起,现在六点钟天就亮了,如果此时小惠还是七点钟起床的话,相当于‘浪费’了一个小时的光照时间。而如果将闹钟上的时间拨快一个小时(太阳提前一个小时就升起了),那么同样七点起床(闹钟上显示的是七点而实际上是六点),学习十二个小时,到了晚上六点钟上床睡觉(节约了六点到七点的用电时间)。所以使用夏令时的地区,就相当于倡导大家早睡早起,使居民能够尽可能的享受自然阳关,从而达到节约家庭用电的目的。
2.1 真正的图说time.h
这张图是真正的一图说清楚time.h中相关的函数的功能,你一定要认真的多看几次,首先图1三种时间格式的变换图,变换图最低层的时间是“日历时间”即从1970年1月1日0:0:0开始到现在时间的时间秒数,也叫做时间戳。一般时间戳指UTC时间戳。中间层的时间是“分解时间”,即是用一个结构体来表示时间,结构体的成员中包括年,月,日,时,分,秒,星期,一年中的总天数等。最顶层的时间,“字符串时间”,是我根据这个图的上下时间格式转换而命名的一个字符串时间,实际就是把分解时间结构体的年,月,日,时,分,秒打印到一个字符串中去,格式化时间。time.h文件中提供的函数就是实现了这三种时间的相互转换,注意时间转换成分解时间时是与时区相关的。
2.2 不同编译器的差别
上图中时间相关函数的功能介绍引用自keil编译器中的time.h文件,其他编译器的中相关函数的定义总体一样,细节上可能有区别,请自行查看相关编译器下的time.h文件。keil编译器中time.h函数中没有时区相关功能的配置函数,即keil中所有的时间转换都是指的是UTC时间或GMT时间,应用程序自行定义时区来计算本地时间。
IAR编译器和GCC编译器提供了相关的时区设置函数,比如把时区设置为北京时区,可以调用函数setenv("TZ", "GMT-8", 1); 和函数tzset()。