• 时间操作


     在实际开发中,对日期和时间的操作需求非常多,例如程序启动和退出的时间,程序执行任务的时间,数据生成的时间,数据处理的各环节的时间等,无处不在。

           在学习时间之前,请把操作系统的时区设置为中国北京或上海时间。

    time_t别名

           在C语言中,用time_t来表示时间数据类型,它是一个long(长整数)类型的别名,在time.h文件中定义,表示一个日历时间,是从1970年1月1日0时0分0秒到现在的秒数。

                  typedef long time_t;  

           可以看出time_t其实是一个长整型。

    time库函数

           time函数的用途是返回一个值,也就是从1970年1月1日0时0分0秒到现在的秒数。

           time函数是C语言标准库中的函数,在time.h文件中声明。

                  time_t time(time_t *t);

           time函数有两种调用方法:

                  time_t tnow;

                  tnow =time(0);     // 将空地址传递给time函数,并将time返回值赋给变量tnow

                  或

                  time(&tnow);       // 将变量tnow的地址作为参数传递给time函数

           各位可以写代码测试一下这两种方式,效果完全相同。

    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;   /* 夏令时标识符,该字段意义不大,我们不用夏令时。 */

           };

           这个结构定义了年、月、日、时、分、秒、星期、当年中的某一天、夏令时。用这个结构体可以很方便的显示时间。

    localtime库函数

           localtime函数用于把time_t表示的时间转换为struct tm表示的时间,函数返回struct tm结构体的地址。

           函数声明:

                   struct tm * localtime(const time_t *);

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

           示例(book128.c)

           

           输出结果

           

    mktime库函数

           mktime函数的功能与localtime函数相反。

           localtime函数用于把time_t表示的时间转换为struct tm表示的时间。

           mktime  函数用于把struct tm表示的时间转换为time_t表示的时间。

           函数返回time_t的值。

                  time_t mktime(struct tm *tm);

           示例(book130.c)

           

           运行结果

           

    程序睡眠

           在实际开发中,我们经常需要把程序挂起一段时间,可以使用sleep和usleep两个库函数,需要包含unistd.h头文件中。函数的声明如下:

                  unsigned int sleep(unsigned int seconds);

                  int usleep(useconds_t usec);

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

                  sleep(1);           // 程序睡眠1秒。

                  sleep(10);          // 程序睡眠10秒。

                  usleep(100000);    // 程序睡眠十分之一秒。

                  usleep(1000000);   // 程序睡眠一秒。

           程序员不关心sleep和usleep函数的返回值。

    精确到微秒的计时器

    1、timeval结构体

           timeval结构体在sys/time.h文件中定义,声明为:

           struct  timeval

           {

                   long  tv_sec;            // 1970年1月1日到现在的秒。

                   long  tv_usec;         // 当前秒的微妙,即百万分之一秒。

           };

    2、timezone 结构体

           timezone 结构体在sys/time.h文件中定义,声明为:

           struct  timezone

           {

                  int tz_minuteswest;     // 和greenwich 时间差了多少分钟。

             int tz_dsttime;           // type of DST correction。

           }

    3、gettimeofday库函数

           gettimeofday是获得当前的秒和微秒的时间,其中的秒是指1970年1月1日到现在的秒,微秒是指当前秒已逝去的微秒数,可以用于程序的计时。调用gettimeofday函数需要包含sys/time.h头文件。

           函数声明:

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

           当前的时间存放在tv 结构体中,当地时区的信息则放到tz所指的结构中。

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

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

           示例(book132.c)

           

           运行结果

           

           各位,book132.c程序采用usleep睡眠十分之一秒,但是计时器显示的实际时间大于十分之一秒,为何?原因很简单,因为程序执行需要时间,虽然这个时间很短,在千分之一秒内,那也是需要时间。

           还有一个要注意的问题,time.h 是ISO C99 标准日期时间头文件。sys/time.h 是Linux 系统的日期时间头文件,也就是说,timeval、timezone结构体和gettimeofday函数在windows平台中不能使用。

    应用经验

           在实际开发中,除了当前的时间,还经常需要一个偏移量的时间,例如获取十分钟之后的时间,做法是采用time函数得到一个整数后,再加上10*60秒,再用localtime函数转换为结构体。

    版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net

    作者:码农有道

    如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

    如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

  • 相关阅读:
    React Hooks用法大全
    SourceTree3.2.6版本跳过注册办法
    微服务SpringCloud项目架构搭建入门
    参考微信公众平台的加解密接口实现方式
    带有function的JSON对象的序列化与还原
    关于datatables与jquerUI版本冲突问题
    有关于分布式缓存Hazelcast
    bootstrap datepicker含有hasDatepicker无法弹出
    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
    Spring boot整合Hive
  • 原文地址:https://www.cnblogs.com/coolYuan/p/13614934.html
Copyright © 2020-2023  润新知