简介
- Linux POSIX
详解
Linux POSIX 详解
<time.h>
是 C 标准库中的一个头文件,用于处理日期和时间相关的操作。它同时也是 POSIX 操作系统接口的一部分,提供了在 POSIX 兼容环境下处理时间的函数和类型。
以下是 <time.h>
中一些关键组成部分的详解:
时间类型:
-
time_t
:表示自 1970 年 1 月 1 日 00:00:00 UTC(称为 Epoch)以来经过的秒数。它通常用于存储和操作时间值。 -
struct tm
:表示一个日期和时间,以其各个组成部分表示(例如年、月、日、小时、分钟、秒等)。
函数:
-
time()
:从系统时钟获取当前时间,并以time_t
值的形式返回。 -
gmtime()
:将time_t
值转换为包含 UTC 时间的struct tm
结构。 -
localtime()
:将time_t
值转换为包含本地时间的struct tm
结构,已经根据当前时区进行了调整。 -
mktime()
:将struct tm
时间表示转换为time_t
值。 -
strftime()
:根据格式字符串,将struct tm
时间值格式化为指定的字符串表示形式。 -
difftime()
:计算两个time_t
值之间的差异,以秒为单位返回差值。
常量:
-
Epoch:定义为时间的起始点,通常被表示为 1970 年 1 月 1 日(00:00:00 UTC)。
-
与日期/时间计算相关的常量:比如
SECONDS_PER_MINUTE
(每分钟秒数)、SECONDS_PER_HOUR
(每小时秒数)、SECONDS_PER_DAY
(每天秒数)等,用于时间计算。
时间操作:
通过 <time.h>
,你可以进行各种时间相关的操作,比如:
- 获取当前时间和日期。
- 在不同的时间表示之间进行转换(比如
time_t
和struct tm
)。 - 将时间值格式化为字符串。
- 对时间值进行算术运算。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <time.h>
int main() {
time_t currentTime;
struct tm *localTime;
// 获取当前时间
currentTime = time(NULL);
// 将当前时间转换为本地时间
localTime = localtime(¤tTime);
// 显示本地时间
printf("当前本地时间和日期:%s", asctime(localTime));
return 0;
}
这个示例演示了如何使用 <time.h>
中的函数获取当前本地时间和日期,并将其打印到控制台。
请注意,虽然 <time.h>
提供了在 C 中进行基本日期和时间操作的功能,但是对于更高级的操作或在 C++ 中进行操作时,可能有更现代和功能更强大的库可用,比如 C++ 中的 <chrono>
,或者其他库提供的更高级抽象。
Linux POSIX time() 详解
time()
是 POSIX 操作系统中 <time.h>
头文件中所定义的一个函数,用于获取当前系统时间,并以 time_t
格式返回从 Epoch(1970 年 1 月 1 日 00:00:00 UTC)到当前时间经过的秒数。
函数签名:
1
time_t time(time_t *seconds);
- 返回值:返回一个
time_t
类型的值,表示自 Epoch 起至当前时间经过的秒数。 - 参数:
seconds
(可选):一个指向time_t
类型变量的指针。如果不为NULL
,函数会把获取到的当前时间也存储在这个指针所指向的位置,以便于进一步使用。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <time.h>
int main() {
time_t currentTime;
// 获取当前时间
currentTime = time(NULL);
printf("当前时间(自 Epoch 起的秒数):%lld\n", (long long)currentTime);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明一个
time_t
类型的变量currentTime
。 - 使用
time(NULL)
函数来获取当前时间,NULL
作为参数意味着函数只返回当前时间,不将其存储到其他地方。 - 使用
printf()
将获取的当前时间值打印出来。
注意事项:
time()
函数返回的时间值通常是自 Epoch(1970 年 1 月 1 日 00:00:00 UTC)起至当前时间的秒数。这个值的精度因系统而异,一般是秒级别的精度。- 如果
seconds
参数不为NULL
,则会将当前时间的值保存到这个参数所指向的位置,方便进一步处理。
time()
函数在 C 编程中常用于获取时间戳或者记录程序运行时间等任务。
Linux POSIX gmtime() 详解
gmtime()
是 POSIX 操作系统中 <time.h>
头文件中定义的一个函数,用于将 time_t
类型的时间值(从 Epoch 起的秒数)转换为一个 UTC(协调世界时)时间的结构体表示,即 struct tm
类型。
函数签名:
1
struct tm *gmtime(const time_t *timep);
- 返回值:返回一个指向
struct tm
结构体的指针,其中包含了由time_t
值表示的 UTC 时间的各个分量。 - 参数:
timep
:一个指向time_t
类型变量的指针,表示待转换的时间值。
struct tm
结构体定义:
struct tm
结构体包含了表示时间的各个成员变量,例如年、月、日、小时、分钟、秒等,它的定义通常如下:
1
2
3
4
5
6
7
8
9
10
11
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
int tm_year; // 自 1900 年起至今的年数
int tm_wday; // 一周中的天数,范围 0-6 (0 表示周日)
int tm_yday; // 一年中的天数,范围 0-365
int tm_isdst; // 夏令时标志(0 表示不使用夏令时,正值表示夏令时,负值表示信息不可用)
};
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <time.h>
int main() {
time_t currentTime;
struct tm *utcTime;
// 获取当前时间
currentTime = time(NULL);
// 将当前时间转换为 UTC 时间
utcTime = gmtime(¤tTime);
// 显示 UTC 时间的各个成员
printf("UTC 时间:%d-%02d-%02d %02d:%02d:%02d\n",
utcTime->tm_year + 1900, utcTime->tm_mon + 1, utcTime->tm_mday,
utcTime->tm_hour, utcTime->tm_min, utcTime->tm_sec);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明一个
time_t
类型的变量currentTime
和一个指向struct tm
的指针utcTime
。 - 使用
time(NULL)
函数获取当前时间。 - 使用
gmtime(¤tTime)
函数将获取的时间转换为 UTC 时间,并将结果保存在utcTime
指针指向的位置。 - 使用
printf()
打印 UTC 时间的各个成员变量,需要注意月份应加一、年份需要加上 1900。
gmtime()
函数将 time_t
类型的时间值转换为 UTC 时间的结构体表示,方便对时间进行更详细的分析和处理。
Linux POSIX localtime() 详解
localtime()
是 POSIX 操作系统中 <time.h>
头文件中定义的一个函数,用于将 time_t
类型的时间值(从 Epoch 起的秒数)转换为一个本地时间的结构体表示,即 struct tm
类型。
函数签名:
1
struct tm *localtime(const time_t *timep);
- 返回值:返回一个指向
struct tm
结构体的指针,其中包含了由time_t
值表示的本地时间的各个分量。 - 参数:
timep
:一个指向time_t
类型变量的指针,表示待转换的时间值。
struct tm
结构体定义:
struct tm
结构体包含了表示时间的各个成员变量,例如年、月、日、小时、分钟、秒等,它的定义通常如下:
1
2
3
4
5
6
7
8
9
10
11
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
int tm_year; // 自 1900 年起至今的年数
int tm_wday; // 一周中的天数,范围 0-6 (0 表示周日)
int tm_yday; // 一年中的天数,范围 0-365
int tm_isdst; // 夏令时标志(0 表示不使用夏令时,正值表示夏令时,负值表示信息不可用)
};
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <time.h>
int main() {
time_t currentTime;
struct tm *localTime;
// 获取当前时间
currentTime = time(NULL);
// 将当前时间转换为本地时间
localTime = localtime(¤tTime);
// 显示本地时间的各个成员
printf("本地时间:%d-%02d-%02d %02d:%02d:%02d\n",
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明一个
time_t
类型的变量currentTime
和一个指向struct tm
的指针localTime
。 - 使用
time(NULL)
函数获取当前时间。 - 使用
localtime(¤tTime)
函数将获取的时间转换为本地时间,并将结果保存在localTime
指针指向的位置。 - 使用
printf()
打印本地时间的各个成员变量,需要注意月份应加一、年份需要加上 1900。
localtime()
函数将 time_t
类型的时间值转换为本地时间的结构体表示,这样就可以方便地对时间进行更详细的分析和处理,并以易读的形式输出。
Linux POSIX mktime() 详解
mktime()
是 POSIX 操作系统中 <time.h>
头文件中定义的一个函数,用于将一个表示日期和时间的 struct tm
结构体转换为 time_t
类型的时间值(从 Epoch 起的秒数)。
函数签名:
1
time_t mktime(struct tm *timeptr);
- 返回值:返回一个
time_t
类型的值,表示由struct tm
结构体表示的时间值,即从 Epoch 起的秒数。 - 参数:
timeptr
:一个指向struct tm
结构体的指针,表示待转换为time_t
类型的时间值。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <time.h>
int main() {
struct tm dateTime;
time_t timeValue;
// 填充日期和时间信息到 struct tm 结构体
dateTime.tm_year = 2023 - 1900; // 年份从 1900 开始计数
dateTime.tm_mon = 11 - 1; // 月份从 0 开始计数
dateTime.tm_mday = 23; // 日期
dateTime.tm_hour = 10; // 小时
dateTime.tm_min = 30; // 分钟
dateTime.tm_sec = 0; // 秒
// 将 struct tm 结构体转换为 time_t 类型的时间值
timeValue = mktime(&dateTime);
// 显示转换后的时间值(从 Epoch 起的秒数)
printf("转换后的时间值:%lld\n", (long long)timeValue);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明一个
struct tm
类型的变量dateTime
和一个time_t
类型的变量timeValue
。 - 填充
struct tm
结构体dateTime
中的年、月、日、小时、分钟、秒等成员变量。 - 使用
mktime(&dateTime)
函数将struct tm
结构体转换为time_t
类型的时间值,并将结果保存在timeValue
变量中。 - 使用
printf()
打印转换后的时间值(从 Epoch 起的秒数)。
mktime()
函数将日期和时间信息从 struct tm
结构体转换为 time_t
类型的时间值,方便在不同的时间表示之间进行转换。
Linux POSIX strftime() 详解
strftime()
是 POSIX 操作系统中 <time.h>
头文件中定义的一个函数,用于将 struct tm
结构体表示的时间值格式化为指定格式的字符串。
函数签名:
1
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);
- 返回值:返回生成的字符串的字符数(不包括空字符
\0
),如果格式化失败或者输出的字符串超出了maxsize
的限制,则返回 0。 - 参数:
s
:一个指向字符数组的指针,用于存储生成的格式化后的字符串。maxsize
:字符数组s
的最大长度,以防止溢出。format
:一个表示输出格式的字符串。该格式字符串可以包含转换说明符以及普通字符。timeptr
:一个指向struct tm
结构体的指针,表示待格式化的时间值。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <time.h>
int main() {
struct tm dateTime;
char buffer[80];
// 填充日期和时间信息到 struct tm 结构体
dateTime.tm_year = 2023 - 1900; // 年份从 1900 开始计数
dateTime.tm_mon = 11 - 1; // 月份从 0 开始计数
dateTime.tm_mday = 23; // 日期
dateTime.tm_hour = 10; // 小时
dateTime.tm_min = 30; // 分钟
dateTime.tm_sec = 0; // 秒
// 格式化 struct tm 结构体中的时间信息为字符串
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &dateTime);
// 显示格式化后的字符串
printf("格式化后的时间字符串:%s\n", buffer);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明一个
struct tm
类型的变量dateTime
和一个字符数组buffer
。 - 填充
struct tm
结构体dateTime
中的年、月、日、小时、分钟、秒等成员变量。 - 使用
strftime()
函数将struct tm
结构体中的时间信息格式化为字符串,按照给定的格式"%Y-%m-%d %H:%M:%S"
(表示年-月-日 时:分:秒)。 - 生成的格式化后的字符串保存在
buffer
数组中,并使用printf()
打印出来。
strftime()
函数可以根据指定的格式将 struct tm
结构体表示的时间值格式化为字符串,非常方便用于生成各种不同格式的日期时间字符串。
Linux POSIX difftime() 详解
difftime()
是 POSIX 操作系统中 <time.h>
头文件中定义的一个函数,用于计算两个 time_t
类型的时间值之间的差异,返回结果以秒为单位。
函数签名:
1
double difftime(time_t time1, time_t time0);
- 返回值:返回一个
double
类型的值,表示两个时间值之间的差异(以秒为单位)。 - 参数:
time1
:第一个time_t
类型的时间值。time0
:第二个time_t
类型的时间值。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <time.h>
int main() {
time_t currentTime;
time_t startTime;
double difference;
// 获取当前时间和起始时间
currentTime = time(NULL);
startTime = 1638732000; // 2021-12-06 12:00:00 的时间戳
// 计算两个时间之间的差异
difference = difftime(currentTime, startTime);
// 显示两个时间之间的差异(秒数)
printf("时间差:%f 秒\n", difference);
return 0;
}
解释示例:
- 引入
<stdio.h>
和<time.h>
头文件。 - 声明
time_t
类型的变量currentTime
、startTime
和double
类型的变量difference
。 - 使用
time(NULL)
获取当前时间戳currentTime
,并将特定日期时间的时间戳(2021-12-06 12:00:00
)存储在startTime
变量中。 - 使用
difftime()
函数计算当前时间currentTime
和特定起始时间startTime
之间的差异。 - 将计算得到的时间差异(秒数)显示在控制台上。
difftime()
函数可用于计算两个 time_t
类型的时间值之间的差异,常用于测量时间间隔或计算程序执行时间等场景。