栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux&C 时间操作

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux&C 时间操作

一、UNIX系统时间概念

UNIX操作系统根据计算机产生的年代和应用采用1970年1月1日作为UNIX的纪元时间,1970年1月1日0点作为计算机表示时间的是中间点,将从1970年1月1日开始经过的秒数用一个整数存放,这种高效简洁的时间表示方法被称为“Unix时间纪元”,向左和向右偏移都可以得到更早或者更后的时间。

二、获取当前时间相关函数

需要time库函数和localtime库函数配合使用。

- time库函数

time函数的用途是返回一个值,也就是从1970年1月1日0时0分0秒到现在的秒数。
time函数是C语言标准库中的函数,在time.h文件中声明。

time_t time(time_t *t);
#include 

time函数有两种调用方法:
  time_t tnow;
  tnow =time(0);     // 将空地址传递给time函数,并将time返回值赋给变量tnow
或
  time(&tnow);       // 将变量tnow的地址作为参数传递给time函数
这两种方式,效果完全相同。

- localtime库函数

localtime函数用于把time_t表示的时间转换为struct tm结构体表示的时间,
函数返回struct tm结构体的地址。
函数声明:
struct tm * localtime(const time_t *);
#include 

struct tm结构体包含了时间的各要素,但还不是我们习惯的时间表达方式,我们可以用格式化输出printf、sprintf或fprintf等函数,把struct tm结构体转换为我们想要的结果。

struct tm结构体:

time_t只是一个长整型,不符合我们的使用习惯,需要转换成可以方便表示时间的结构体,即tm结构体,tm结构体在time.h中声明,如下:

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,6],其中0代表星期天,1代表星期一,以此类推
  int tm_yday;    // 从每年的1月1日开始的天数:取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推
  int tm_isdst;   // 夏令时标识符,该字段意义不大,我们不用夏令时。
};

综上我们需要获取当前的时间信息实际是在结构体struct tm中,详见下面示例:

#include 
#include 

void main()
{
	time_t tsec;
    printf("time(&tnow)=%ldn",time(&tnow));
    printf("time(0)=%ldn",time(0));

    struct tm * tmi=localtime(&tnow);

    printf("%d-%d-%d 星期%d %d时 %d分 %d秒 第%d天n",
                tmi->tm_year+1900,tmi->tm_mon,tmi->tm_mday,tmi->tm_wday,tmi->tm_hour,tmi->tm_min,tmi->tm_sec,tmi->tm_yday);
}

补充知识:
mktime库函数:

mktime函数的功能与localtime函数相反:
localtime 函数用于把time_t表示的时间转换为struct tm表示的时间。
mktime  函数用于把struct tm表示的时间转换为time_t表示的时间。

time_t mktime(struct tm *tm);
函数返回time_t的值。

示例:

#include 
#include 
#include 
 
int main(int argc,char *argv[])
{
  // 2019-12-25 15:05:03整数表示是1577257503
  struct tm sttm; 
  memset(&sttm,0,sizeof(sttm));
 
  sttm.tm_year=2019-1900; // 注意,要减1900
  sttm.tm_mon=12-1;        // 注意,要减1
  sttm.tm_mday=25;
  sttm.tm_hour=15;
  sttm.tm_min=5;
  sttm.tm_sec=3;
  sttm.tm_isdst = 0;
  printf("2019-12-25 15:05:03 is %lun",mktime(&sttm));
}
三、程序睡眠的时间函数sleep和usleep

包含unistd.h头文件中

函数的声明如下:
unsigned int sleep(unsigned int seconds);
int usleep(useconds_t usec);

sleep函数的参数是秒,usleep函数的参数是微秒,1秒=1000000微秒。

特别注意: 1秒=1000 000微秒。

四、计时器

gettimeofday库函数获得当前的秒和微秒的时间,可以用于程序的计时。
其中的秒是指1970年1月1日到现在的秒,
微秒是指当前秒已逝去的微秒数,

函数声明:

int gettimeofday(struct  timeval *tv, struct  timezone *tz )
当前的时间存放在tv 结构体中,当地时区的信息则放到tz所指的结构体中,tz可以为空。

返回值:函数执行成功后返回0,失败后返回-1。

在使用gettimeofday()函数时,第二个参数一般都为空,我们一般都只是为了获得当前时间,不关心时区的信息。

gettimeofday参数补充知识:

timeval结构体在sys/time.h文件中定义,声明为:
struct timeval
{
  long  tv_sec;  // 1970年1月1日到现在的秒。
  long  tv_usec; // 当前秒的微妙,即百万分之一秒。
};


时区timezone 结构体
timezone 结构体在sys/time.h文件中定义,声明为:
struct timezone
{
  int tz_minuteswest;  // 和UTC(格林威治时间)差了多少分钟。
  int tz_dsttime;      // type of DST correction,修正参数据,忽略
};

利用gettimeofday()函数获取时间差示例:

#include 
#include    // 注意,不是time.h
 
int main()
{
  struct timeval begin,end;  // 定义用于存放开始和结束的时间
 
  gettimeofday(&begin,0);    // 计时器开始
  printf("begin time(0)=%d,tv_sec=%d,tv_usec=%dn",time(0),begin.tv_sec,begin.tv_usec);
 
  sleep(2);
  usleep(100000);     // 程序睡眠十分之一秒。
 
  gettimeofday(&end,0);      // 计时器结束
  printf("end   time(0)=%d,tv_sec=%d,tv_usec=%dn",time(0),end.tv_sec,end.tv_usec);
 
  printf("计时过去了%d微秒。n",
         (end.tv_sec-begin.tv_sec)*1000000+(end.tv_usec-begin.tv_usec));
}
补充知识
time.h 是ISO C99 标准日期时间头文件。
sys/time.h 是Linux 系统的日期时间头文件。

头文件中不带/的都是c标准库文件,带/的都不是标准库文件,
例如带sys/的就是某个系统库头文件。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338577.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号