简介

  • Linux POSIX 详解

Linux POSIX 详解

<time.h> 是 C 标准库中的一个头文件,用于处理日期和时间相关的操作。它同时也是 POSIX 操作系统接口的一部分,提供了在 POSIX 兼容环境下处理时间的函数和类型。

以下是 <time.h> 中一些关键组成部分的详解:

时间类型:

  1. time_t:表示自 1970 年 1 月 1 日 00:00:00 UTC(称为 Epoch)以来经过的秒数。它通常用于存储和操作时间值。

  2. struct tm:表示一个日期和时间,以其各个组成部分表示(例如年、月、日、小时、分钟、秒等)。

函数:

  1. time():从系统时钟获取当前时间,并以 time_t 值的形式返回。

  2. gmtime():将 time_t 值转换为包含 UTC 时间的 struct tm 结构。

  3. localtime():将 time_t 值转换为包含本地时间的 struct tm 结构,已经根据当前时区进行了调整。

  4. mktime():将 struct tm 时间表示转换为 time_t 值。

  5. strftime():根据格式字符串,将 struct tm 时间值格式化为指定的字符串表示形式。

  6. difftime():计算两个 time_t 值之间的差异,以秒为单位返回差值。

常量:

  1. Epoch:定义为时间的起始点,通常被表示为 1970 年 1 月 1 日(00:00:00 UTC)。

  2. 与日期/时间计算相关的常量:比如 SECONDS_PER_MINUTE(每分钟秒数)、SECONDS_PER_HOUR(每小时秒数)、SECONDS_PER_DAY(每天秒数)等,用于时间计算。

时间操作:

通过 <time.h>,你可以进行各种时间相关的操作,比如:

  • 获取当前时间和日期。
  • 在不同的时间表示之间进行转换(比如 time_tstruct 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(&currentTime);

    // 显示本地时间
    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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明一个 time_t 类型的变量 currentTime
  3. 使用 time(NULL) 函数来获取当前时间,NULL 作为参数意味着函数只返回当前时间,不将其存储到其他地方。
  4. 使用 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(&currentTime);

    // 显示 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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明一个 time_t 类型的变量 currentTime 和一个指向 struct tm 的指针 utcTime
  3. 使用 time(NULL) 函数获取当前时间。
  4. 使用 gmtime(&currentTime) 函数将获取的时间转换为 UTC 时间,并将结果保存在 utcTime 指针指向的位置。
  5. 使用 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(&currentTime);

    // 显示本地时间的各个成员
    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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明一个 time_t 类型的变量 currentTime 和一个指向 struct tm 的指针 localTime
  3. 使用 time(NULL) 函数获取当前时间。
  4. 使用 localtime(&currentTime) 函数将获取的时间转换为本地时间,并将结果保存在 localTime 指针指向的位置。
  5. 使用 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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明一个 struct tm 类型的变量 dateTime 和一个 time_t 类型的变量 timeValue
  3. 填充 struct tm 结构体 dateTime 中的年、月、日、小时、分钟、秒等成员变量。
  4. 使用 mktime(&dateTime) 函数将 struct tm 结构体转换为 time_t 类型的时间值,并将结果保存在 timeValue 变量中。
  5. 使用 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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明一个 struct tm 类型的变量 dateTime 和一个字符数组 buffer
  3. 填充 struct tm 结构体 dateTime 中的年、月、日、小时、分钟、秒等成员变量。
  4. 使用 strftime() 函数将 struct tm 结构体中的时间信息格式化为字符串,按照给定的格式 "%Y-%m-%d %H:%M:%S"(表示年-月-日 时:分:秒)。
  5. 生成的格式化后的字符串保存在 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;
}

解释示例:

  1. 引入 <stdio.h><time.h> 头文件。
  2. 声明 time_t 类型的变量 currentTimestartTimedouble 类型的变量 difference
  3. 使用 time(NULL) 获取当前时间戳 currentTime,并将特定日期时间的时间戳(2021-12-06 12:00:00)存储在 startTime 变量中。
  4. 使用 difftime() 函数计算当前时间 currentTime 和特定起始时间 startTime 之间的差异。
  5. 将计算得到的时间差异(秒数)显示在控制台上。

difftime() 函数可用于计算两个 time_t 类型的时间值之间的差异,常用于测量时间间隔或计算程序执行时间等场景。