Linux时间操作函数(C++)获取时间 转换时间 C++计时 程序睡眠

        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);

过于简单不用演示。

基本的时间操作函数暂时就这些了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值