zoukankan      html  css  js  c++  java
  • 时间操作

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

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

    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

    作者:码农有道

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

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

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/coolYuan/p/13614934.html
Copyright © 2011-2022 走看看