sys/time.h详解

发布时间:2023-05-24

一、介绍

sys/time.h是C/C++语言中的一个标准头文件,包含了与时间相关的函数和数据类型声明。该头文件提供了处理时间的函数和结构体,允许程序在不依赖于机器的底层特性的情况下,处理时间的相关属性,如秒数、微秒数等。

二、数据类型

sys/time.h头文件中包含了两个重要的数据类型:timevaltimezone

#include <sys/time.h>
struct timeval {
    time_t tv_sec;     // 秒数
    suseconds_t tv_usec;    // 微秒数
};
struct timezone {
    int tz_minuteswest;     // 距离格林威治的时区差值(分钟数)
    int tz_dsttime;         // 夏令时标志位
};

三、函数

sys/time.h中包含了一些常用的处理时间的函数:

1. gettimeofday函数

gettimeofday函数获取当前时间,精度为微秒。

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);

该函数接收两个参数:指向timeval类型结构体的指针tv和指向timezone类型结构体的指针tz。如果只需要获取当前时间,通常将第二个参数tz设置为NULL即可。 该函数返回0表示成功,返回-1表示失败。

2. settimeofday函数

settimeofday函数设置系统时间。

#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tz);

该函数接收两个参数:指向timeval类型结构体的指针tv和指向timezone类型结构体的指针tz。 该函数返回0表示成功,返回-1表示失败。

3. time函数

time函数获取当前的时间戳,即从1970年1月1日0时0分0秒开启的秒数(UTC时区)。

#include <time.h>
time_t time(time_t *t);

该函数接收一个参数:指向time_t类型结构体的指针t,该参数可传NULL。如果不传参,则time函数直接返回当前时间戳;如果传参,则将当前时间戳赋值给t,并返回t的值。 该函数返回当前的时间戳。

4. localtime函数

localtime函数将一个时间戳转化为一个当地时间结构体。

#include <time.h>
struct tm *localtime(const time_t *timep);

该函数接收一个参数:指向time_t类型结构体的指针timep。该参数表示时区为UTC的时间戳。 该函数返回一个指向tm类型结构体的指针,该结构体包含了转化后的时间信息,包括年、月、日、时、分、秒等。

5. mktime函数

mktime函数将一个当地时间结构体转化为时间戳。

#include <time.h>
time_t mktime(struct tm *tm);

该函数接收一个指向tm类型结构体的指针tm,其中包含了转化前的当地时间。 该函数返回一个时区为UTC的时间戳。

四、示例代码

下面是一个简单的使用sys/time.h头文件和其中函数的示例代码:

#include <stdio.h>
#include <sys/time.h>
int main() {
    struct timeval t;
    gettimeofday(&t, NULL);
    printf("当前时间是:%d 秒 %d 微秒\n", t.tv_sec, t.tv_usec);
    time_t cur_time;
    cur_time = time(NULL);
    printf("当前时间戳是:%ld\n", cur_time);
    struct tm *local_time;
    local_time = localtime(&cur_time);
    printf("当前时间是:%d-%d-%d %d:%d:%d\n", local_time->tm_year + 1900, local_time->tm_mon + 1, local_time->tm_mday, local_time->tm_hour, local_time->tm_min, local_time->tm_sec);
    struct tm tm;
    tm.tm_year = 2020 - 1900;
    tm.tm_mon = 6 - 1;
    tm.tm_mday = 2;
    tm.tm_hour = 12;
    tm.tm_min = 0;
    tm.tm_sec = 0;
    time_t t2 = mktime(&tm);
    printf("2020年6月2日中午12点的时间戳是:%ld\n", t2);
    return 0;
}