首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01|快速回顾:一个 C 程序的完整生命周期
02|程序基石:数据与量值是如何被组织的?
03|计算单元:运算符是如何工作的?
04|控制逻辑:表达式和语句是如何协调程序运行的?
05|代码封装:函数是如何被调用的?
06|整合数据:枚举、结构与联合是如何实现的?
07|操控资源:指针是如何灵活使用内存的?
08|编译准备:预处理器是怎样处理程序代码的?
09|标准库:字符、字符串处理与数学计算
10|标准库:深入理解标准 IO
11|标准库:非本地跳转与可变参数是怎样实现的?
12|标准库:你需要了解的 C 并发编程基础知识有哪些?
13|标准库:如何使用互斥量等技术协调线程运行?
14|标准库:信号与操作系统软中断有什么关系?
15|标准库:日期、时间与实用函数
16|标准库:断言、错误处理与对齐
17|极致优化:如何实现高性能的 C 程序?
18|生产加速:C 项目需要考虑的编码规范有哪些?
19|生产加速:如何使用自动化测试确保 C 项目质量?
20|生产加速:如何使用结构化编译加速 C 项目构建?
21|实战项目:一个简单的高性能 HTTP Server
22|可执行二进制文件里有什么?
23|进程是如何使用操作系统内存的?
24|编译器在链接程序时发生了什么?
25|程序可以在运行时进行链接吗?
26|C 程序的入口真的是 main 函数吗?
27|ABI 与 API 究竟有什么区别?
28|程序如何与操作系统交互?
当前位置:
首页>>
技术小册>>
深入C语言和程序运行原理
小册名称:深入C语言和程序运行原理
### 15 | 标准库:日期、时间与实用函数 在C语言编程的广阔天地中,标准库(Standard Library)扮演着至关重要的角色,它提供了一系列预定义的功能,帮助开发者高效地完成各种任务,从基本的输入输出到复杂的数据处理,无所不包。本章将深入探讨C语言标准库中与日期、时间处理及实用函数相关的部分,这些功能对于开发需要精确时间控制、日志记录、任务调度等功能的程序至关重要。 #### 15.1 日期与时间处理基础 在C语言中,处理日期和时间主要通过`<time.h>`头文件提供的函数实现。这些函数允许程序获取当前时间、进行时间计算、格式化时间输出等。 ##### 15.1.1 时间类型 C语言标准库中,时间主要通过`time_t`类型表示,它是一个算术类型,用于存储自某一特定时间点(通常是1970年1月1日00:00:00 UTC,即Unix纪元)以来的秒数。此外,`struct tm`结构体用于表示分解后的时间(年、月、日、时、分、秒等),其定义通常如下: ```c struct tm { int tm_sec; // 秒(0-59) int tm_min; // 分(0-59) int tm_hour; // 时(0-23) int tm_mday; // 日(1-31) int tm_mon; // 月(0-11,其中0代表1月) int tm_year; // 年份(自1900年起) int tm_wday; // 一周中的第几天(0-6,其中0代表星期日) int tm_yday; // 一年中的第几天(0-365,闰年为366) int tm_isdst; // 夏令时标志 }; ``` ##### 15.1.2 获取当前时间 要获取当前时间,可以使用`time()`函数,它接受一个指向`time_t`对象的指针作为参数,用于存储获取到的时间。如果不关心具体时间值,可以传递`NULL`。 ```c #include <time.h> time_t rawtime; time(&rawtime); // 获取当前时间 ``` ##### 15.1.3 格式化时间输出 将`time_t`类型的时间转换为人类可读的格式,通常使用`strftime()`函数。该函数允许你指定输出格式,并填充到提供的字符串中。 ```c #include <time.h> char buffer[80]; struct tm *tm_info; time_t now; time(&now); tm_info = localtime(&now); strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_info); printf("Current date and time: %s\n", buffer); ``` #### 15.2 日期与时间的计算 除了获取和格式化时间外,C标准库还提供了进行时间计算的功能,如时间差计算、时间加减等。 ##### 15.2.1 `difftime()`函数 `difftime()`函数用于计算两个时间点之间的差异(以秒为单位)。它接受两个`time_t`类型的参数,返回它们之间的差值(双精度浮点数)。 ```c #include <time.h> time_t start, end; double diff; time(&start); // 执行一些操作... time(&end); diff = difftime(end, start); printf("Elapsed time: %.2f seconds\n", diff); ``` ##### 15.2.2 时间加减 虽然C标准库没有直接提供时间加减的函数,但你可以通过修改`struct tm`结构体中的成员,然后使用`mktime()`函数来更新`time_t`值,实现时间的加减。`mktime()`函数将`struct tm`结构体转换为`time_t`类型,并考虑时区、闰年等因素进行必要的调整。 ```c #include <time.h> time_t now; struct tm *tm_now; time(&now); tm_now = localtime(&now); // 假设我们要加1小时 tm_now->tm_hour += 1; // 注意:如果tm_hour超过23,需要手动处理进位 if (tm_now->tm_hour >= 24) { tm_now->tm_hour -= 24; tm_now->tm_mday++; // 同样,如果tm_mday超过月份的天数,也需要处理 } now = mktime(tm_now); ``` #### 15.3 实用函数 C标准库还包含了一系列实用函数,这些函数虽然不直接处理日期和时间,但在日常编程中非常有用,能够简化许多常见任务。 ##### 15.3.1 字符串处理 - `strcpy()`, `strncpy()`, `strcat()`, `strncat()`: 用于字符串的复制和连接。 - `strcmp()`, `strncmp()`: 用于字符串的比较。 - `strchr()`, `strrchr()`: 用于查找字符串中的字符。 - `strstr()`, `strcasestr()`: 用于查找子字符串。 ##### 15.3.2 内存管理 - `malloc()`, `calloc()`, `realloc()`, `free()`: 用于动态内存分配和释放。 ##### 15.3.3 数值转换 - `atoi()`, `atol()`, `atof()`: 将字符串转换为整数、长整数和浮点数。 - `sprintf()`, `snprintf()`: 将格式化的数据写入字符串。 ##### 15.3.4 排序与搜索 - `qsort()`: 通用排序函数,可以对任意类型的数据进行排序。 - `bsearch()`: 二分搜索函数,用于在已排序数组中查找元素。 #### 15.4 注意事项与最佳实践 - **时区处理**:C标准库中的时间函数默认使用本地时区,但在跨国界或需要精确时间控制的应用中,应明确处理时区问题。 - **夏令时**:`struct tm`中的`tm_isdst`成员用于表示夏令时状态,但自动检测夏令时可能不准确,需要根据实际情况调整。 - **内存管理**:使用动态内存分配时,务必注意内存泄漏和野指针问题,确保及时释放不再使用的内存。 - **错误处理**:许多标准库函数在失败时会返回特定的错误码或设置全局错误变量(如`errno`),编写健壮的程序时应检查这些错误。 #### 结语 本章深入探讨了C语言标准库中与日期、时间处理及实用函数相关的内容。通过掌握这些函数和技巧,你可以更加高效地处理时间相关的任务,编写出更加健壮、易于维护的C语言程序。无论是开发需要精确时间控制的系统,还是处理复杂的日志记录和数据统计,C语言标准库都为你提供了强大的支持。
上一篇:
14|标准库:信号与操作系统软中断有什么关系?
下一篇:
16|标准库:断言、错误处理与对齐
该分类下的相关小册推荐:
c++零基础入门