【Linux】时间操作

前言

UNIX操作系统根据计算机产生的年代把1970年1月1日作为UNIX的纪元时间,1970年1月1日是时间的中间点,将从1970年1月1日起经过的秒数用一个整数存放。

time_t别名

time_t用于表示时间类型,它是一个long类型的别名,在<time.h>文件中定义,表示从1970年1月1日0时0分0秒到现在的秒数。

typedef long time_t;

time()库函数

time()库函数用于获取操作系统的当前时间。
包含头文件:<time.h>

  • 函数声明:
time_t time(time_t *tloc);
  • 两种调用方法:
//第一种
time_t now = time(0);     // 将空地址传递给time()函数,并将time()返回值赋给变量now。

//第二种
time_t now; 
time(&now);   // 将变量now的地址作为参数传递给time()函数。

例子

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    time_t now1 = time(0);

    time_t now2;
    time(&now2);

    cout << now1 <<endl;
    cout << now2 <<endl;

    return 0;
}

tm结构体

time_t是一个长整数,不符合人类的使用习惯,需要转换成tm结构体。

tm结构体在<time.h>中声明,如下:

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()库函数

localtime()函数用于把time_t表示的时间转换为tm结构体表示的时间。
localtime()函数不是线程安全的,localtime_r()是线程安全的。
包含头文件:<time.h>

  • 函数声明:
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

例子

#include <iostream>
#include <time.h>      // 时间操作的头文件。
using namespace std;

int main()
{
  time_t now=time(0);             // 获取当前时间,存放在now中。

  cout << "now=" << 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;
}

mktime()库函数

mktime()函数的功能与localtime()函数相反,用于把tm结构体时间转换为time_t时间。
包含头文件:<time.h>

函数声明:

time_t mktime(struct tm *tm);

该函数主要用于时间的运算,例如:把2022-03-01 00:00:25加30分钟。
思路:

  • 1)解析字符串格式的时间,转换成tm结构体;
  • 2)用mktime()函数把tm结构体转换成time_t时间;
  • 3)把time_t时间加30*60秒;
  • 4)用localtime_r()函数把time_t时间转换成tm结构体;
  • 5)把tm结构体转换成字符串。

gettimeofday()库函数

用于获取1970年1月1日到现在的秒和当前秒中已逝去的微秒数,可以用于程序的计时。
包含头文件:<sys/time.h>

函数声明:

int gettimeofday(struct timeval *tv, struct timezone *tz);

struct timeval {
  time_t      tv_sec;    	/* 1970-1-1到现在的秒数 */
  suseconds_t tv_usec;   	/* 到现在的微秒数 */
}; 

struct timezone {         /* 在实际开发中,派不上用场 */
  int tz_minuteswest;   	/* minutes west of Greenwich */ 
  int tz_dsttime;         	/* type of DST correction */
}; 

示例

#include
#include <sys/time.h> // gettimeofday()需要的头文件。
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);  		//单位是微秒
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值