时间操作

结构体定义

tm 结构体

  • tm 结构体用于存储日期和时间信息,定义如下:
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 表示一月份,取值范围 [0,11]
    int tm_year;   // 年份,值为实际年份减去 1900
    int tm_wday;   // 星期几,0 表示星期天,取值范围 [0,6]
    int tm_yday;   // 一年中第几天,0 表示一月一日,取值范围 [0,365]
    int tm_isdst;  // 夏令时标志符
};

timeval 结构体

  • timeval 结构体用于存储时间,精确到微秒,定义如下:
struct timeval {
    long tv_sec;  // 当前时间戳
    long tv_usec; // 当前时间戳过去了多少微秒
};

timezone 结构体

  • timezone 结构体用于存储时区信息,定义如下:
struct timezone {
    int tz_minuteswest; // 和 UTC 时间差多少分钟
    int tz_dsttime;     // 夏令时信息
};

获取当前时间戳

  • 使用 time.h 头文件中的 time 函数获取当前时间戳,以秒为单位。time_t 是一个长整型,用于表示时间戳。
time_t t;
t = time(0); // 或者 time(&t);
printf("现在的时间戳是:%ld\n", t);

将时间戳转换为 tm 结构体

  • 使用 localtime 函数将时间戳转换为 tm 结构体,该结构体包含年、月、日、时、分、秒等信息。
struct tm *datetime = localtime(&t);
printf("现在是%d-%02d-%02d %02d:%02d:%02d\n", datetime->tm_year + 1900, datetime->tm_mon + 1, datetime->tm_mday, datetime->tm_hour, datetime->tm_min, datetime->tm_sec);

tm 结构体转换回时间戳

  • 使用 mktime 函数将 tm 结构体转换回时间戳。
t = mktime(datetime);
printf("tm结构体的转换结果:%ld\n", t);

程序睡眠

  • 使用 unistd.h 头文件中的 sleepusleep 函数使程序暂停执行一段时间。
unsigned int a = usleep(1000000 * 1); // 睡眠1秒
int b = sleep(1); // 睡眠1秒
printf("a=%u, b=%d\n程序睡眠一秒后\n");

获取精确到微秒的时间及时间区信息

  • 使用 sys/time.h 头文件中的 gettimeofday 函数获取当前时间,精确到微秒,并获取时区信息。
struct timeval *tv = malloc(sizeof(struct timeval)); // 分配timeval结构体内存
struct timezone *tz = malloc(sizeof(struct timezone)); // 分配timezone结构体内存
int flag = gettimeofday(tv, tz); // 获取当前时间及时间区信息
printf("flag=%d\n", flag);
printf("当前的时间戳是:%ld, 距离时间戳过去了%ld微秒, 与UTC时间相差%d分钟\n", tv->tv_sec, tv->tv_usec, tz->tz_minuteswest);
  • 完整实例代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include "sys/time.h"
int main(){
    //获取当前的时间戳,以秒为单位
    //time_t time(time_t *time);
    //在time.h文件中有定义,typedef long time_t
    time_t t;
    //两种方式等价
    t = time(0);
    // time(&t);
    printf("现在的时间戳是:%ld\n",t);
    /*
        tm结构体
        struct tm{
            //秒,取值范围[0,59]
            int tm_sec;
            //分钟,取值范围[0,59]
            int tm_min;
            //小时,取值范围[0,23]
            int tm_hour;
            //日期,取值范围[1,31]
            int tm_mday;
            //月份,0表示一月份,取值范围[0,11]
            int tm_mon;
            //年份,值为实际年份减去1900
            int tm_year;
            //星期几,0表示星期天,取值范围[0,6]
            int tm_wday;
            //一年中第几天,0表示一月一日,取值范围[0,365]
            int tm_yday;
            //夏令营时标志符
            int tm_isdst;
        }
    */
    //将时间戳转为tm结构体
    //struct tm *localtime(const time_t *)
    struct tm *datatime = localtime(&t);
    printf("现在是%d-%02d-%02d %02d:%02d:%02d\n",datatime->tm_year+1900,datatime->tm_mon+1,datatime->tm_mday,datatime->tm_hour,datatime->tm_min,datatime->tm_sec);
    //将tm结构体转为时间戳time_t
    //time_t mktime(struct tm *tm);
    t = mktime(datatime);
    printf("tm结构体的转换结果:%ld\n",t);
    

    //程序睡眠函数,1秒=1000000微秒,下面两个函数在unistd.h头文件中
    //unsigned int sleep(undigned int seconds),睡眠的单位是秒
    //int usleep(useconds_t usec),睡眠的单位是微秒
    //程序睡眠一秒
    unsigned int a = usleep(1000000*1);
    int b = sleep(1);
    printf("a=%u,b=%d\n程序睡眠一秒后\n");

    /*
        在头文件sys/time.h中定义的的两个结构体
        struct timeval{
            //当前时间戳
            long tv_sec;
            //当前时间戳过去了多少微秒
            long tv_usec;
        }
        struct timezone{
            //和UTC时间差多少分钟
            int tz_minuteswest;
            //
            int tz_dsttime;
        }
      在头文件sys/time.h中定义的时间函数
      int gettimeofday(struct timeval *tv,struct timezone *tz),成功返回0,失败返回-1
    */
    //获取时间,精确到微秒,还包括时区信息
    struct timeval *tv = malloc(sizeof(struct timeval));
    struct timezone *tz = malloc(sizeof(struct timezone));
    int flag = gettimeofday(tv,tz);
    printf("flag=%d\n",flag);
    printf("当前的时间戳是:%ld,距离时间戳过去了%ld微秒,与UTC时间相差%d分钟\n",tv->tv_sec,tv->tv_usec,tz->tz_minuteswest);
    return 0;
}