时间操作
结构体定义
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
头文件中的 sleep
和 usleep
函数使程序暂停执行一段时间。
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;
}