UNI操作系统将1970年1月1日作为纪元时间,将从1970年1月1日0分0秒起至今的秒数作为一个整数存放。也就是一个long数据类型,为这个long起别名方便阅读使用,就是typedef long time_t,在头文件<time.h>中定义。
一.time()库函数
time()库函数用于获取操作系统当前时间。需要声明头文件<time.h>。
函数声明:time_t time(time_t *tloc);
调用方法:(1).time_t now=time(0);
(2).time_t now;time(&now);
二.localtime()库函数
首先是tm结构体,因为time_t是一个长整数不便于使用,所以要用localtime()库函数来转换时间格式,使用该库函数需要知道tm结构体:
struct tm
{
int tm_year; // 年份:其值等于实际年份减去 1900
int tm_mon; // 月份:取值区间为[0,11],其中 0 代表一月,11 代表 12 月
int tm_mday; // 日期:一个月中的日期,取值区间为[1,31]
int tm_hour; // 时:取值区间为[0,23]
int tm_min; // 分:取值区间为[0,59]
int tm_sec; // 秒:取值区间为[0,59]
int tm_wday; // 星期:取值区间为[0,6],其中 0 代表星期天,6 代表星期六
int tm_yday; // 从每年的 1 月 1 日开始算起的天数:取值区间为[0,365]
int tm_isdst; // 夏令时标识符,该字段意义不大
};
这样时间表示就很清晰便于日常使用了。
使用localtime_r()库函数线程安全,均包含在头文件<time.h>
函数声明如下:
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);
返回的都是结构体指针,_r库函数参数1是time_t长整数指针,参数2是用于存放结果的结构体指针。也就是说转化前需要创建一个tm结构体对象。
然后根据tm结构体拼接成日常使用的字符创格式。
#include <iostream>
#include <time.h> // 时间操作的头文件。
using namespace std;
int main()
{
time_t now=time(0); // 获取当前时间,存放在 now 中。
cout << now << endl; // 显示当前时间,1970 年 1 月 1 日到现在的秒数。
tm tmnow;
localtime_r(&now,&tmnow); // 把整数的时间转换成 tm 结构体。
// 根据 tm 结构体拼接成习惯的字符串格式。
string stime = to_string(tmnow.tm_year+1900)+"-"
+ to_string(tmnow.tm_mon+1)+"-"
+ to_string(tmnow.tm_mday)+" "
+ to_string(tmnow.tm_hour)+":"
+ to_string(tmnow.tm_min)+":"
+ to_string(tmnow.tm_sec);
cout << "stime=" << stime << endl;
}
注意:tm_year要+1900,tm_mon要+1;
三.mktime()库函数
作用与localtime()相反,是将结构体转换回time_t时间。有什么用呢,用来自定义修改计算时间。
函数定义:time_t mktime(struct tm *tm);
转换:先解析时间字符串,转换回结构体格式,然后用该库函数转换回time_t长整数格式,之后比如说加一刻钟(15分钟),就是time_t时间+15*60,然后参见上述localtime()函数转换为字符串格式就完成了。
四.gettimeofday()库函数
用于获取1970.1.1至今的秒数与当前逝去的微秒数,可用于程序的计时。
函数声明与相关结构体定义如下:
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
time_t tv_sec; /* 1970-1-1 到现在的秒数 */
suseconds_t tv_usec; /* 当前秒中,已逝去的微秒数 */
};
timezone基本没啥用,不想写了。
计时:
#include <iostream>
#include <sys/time.h>
using namespace std;
int main()
{
timeval start,end;
gettimeofday(&start, 0 ); // 计时开始。
for (int ii=0;ii<1000000000;ii++)
;
gettimeofday(&end, 0 ); // 计时结束。
// 计算消耗的时长。
timeval tv;
tv.tv_usec=end.tv_usec-start.tv_usec;
tv.tv_sec=end.tv_sec-start.tv_sec;
if (tv.tv_usec<0)
{
tv.tv_usec=1000000-tv.tv_usec;
tv.tv_sec--;
}
cout << "耗时:" << tv.tv_sec << "秒" << tv.tv_usec << "微秒。\n";
}
五.程序睡眠
挂起程序可以使用sleep()和usleep()两个库函数。
头文件声明:<unistd.h>
unsigned int sleep(unsigned int seconds);
int usleep(useconds_t usec);
过于简单不用演示。
基本的时间操作函数暂时就这些了。