zoukankan      html  css  js  c++  java
  • c++<ctime>中常用函数

      先说一下c++标准库并没有提供所谓的日期类型,而是继承了c的日期类型

    <cmath>里面有些常用的函数,比如计时函数clock()、获取系统时间的函数time(),下面就具体的介绍一下

    1. clock()

        c++中对clock()的定义为:clock_t clock(void);可以看出,clock为无参函数,返回clock_t型数据;它用于计算从程序启动到调用该函数所占用

        cpu的时间,若时间不可取,返回-1;默认计算时间为毫秒(ms)。下面说一下具体用法,先上代码

    #include<iostream>
    #include<ctime>
    using namespace std;
    int main()
    {
        clock_t start1=clock();  //计时开始
        for(int i=0;i<100000000;)
        {
            ++i;
        }
        clock_t end1=clock();  //计时结束
        clock_t start2=clock();  //计时开始
        for(int i=0;i<200000000;i++)
        {
            ++i;
        }
        clock_t end2=clock();  //计时结束
        cout<<"第一个for循环运行时间:"<<end1-start1<<"ms
    ";
        cout<<"第二个for循环运行时间:"<<end2-start2<<"ms
    ";
        cout<<"整个程序运行时间:"<<clock()<<"ms
    ";
        return 0;
    }

    结果如下图

    第二个for循环运行时间基本上是第一个的2倍,整个程序的运行时间基本就是两个for循环执行时间的总和。另外,现在输的出的时间是毫秒,也可以

    让输出的时间是秒s,这里就要介绍一下CLOCKS_PER_SEC了。CLOCKS_PER_SEC是定义在头文件"time.h"中的一个常量,表示一秒钟有多少个

    时钟计时单元,若要输出时间为秒,就要用到这个常量。用法为:(double)  clock()/CLOCKS_PER_SEC;只需要改一下上面的程序就行了,代码如下:

    #include<iostream>
    #include<ctime>
    using namespace std;
    int main()
    {
        clock_t start1=clock();  //计时开始
        for(int i=0;i<100000000;)
        {
            ++i;
        }
        clock_t end1=clock();  //计时结束
        clock_t start2=clock();  //计时开始
        for(int i=0;i<200000000;i++)
        {
            ++i;
        }
        clock_t end2=clock();  //计时结束
        cout<<"第一个for循环运行时间:"<<(double)(end1-start1)/CLOCKS_PER_SEC<<"s
    ";
        cout<<"第二个for循环运行时间:"<<(double)(end2-start2)/CLOCKS_PER_SEC<<"s
    ";
        cout<<"整个程序运行时间:"<<(double)clock()/CLOCKS_PER_SEC<<"s
    ";
        return 0;
    }

    运行结果如下:

    可以看到,输出的时间变成了秒。

    2. 下面再说一下如何获取系统日期和时间

       先介绍几个函数,这些函数在"time.h"头文件中的定义直接给了出来,方便理解。介绍这些函数之前先说一个概念——协调世界时,又叫世界标准时间,简写为UTC;

       世界标准时间也就是常说的格林尼治时间。世界标准时间比中国区时间慢8小时(或者说晚8小时),二者总是相差8;如果UTC时间为:2020/04/23   8:00,那么中国

       区时间为:2020/04/23   16:00。

       (1) time_t time(time_t *time);函数time()返回time_t型数据;参数为time_t型指针,一般设置成空指针NULL或0;函数返回系统当前的日历时间,自

            1970年1月1日以来所经历的秒数,这里要特别强调一下是所经历的秒数撒;若系统没有时间则返回1。

       (2) char* ctime(const time_t *time);返回一个表示当地时间(中国区时间)的字符串指针,通过这个指针可以以字符串的形式输出时间。

       (3) struct tm* localtime(const time_t *time);把日历时间转化为本地时间;返回一个指向表示当地时间(即中国区时间)的tm结构体,tm结构体保存了这个本地时间,tm

            在"time.h"头文件中有定义,可以用tm来声明一个指向此类型结构体的指针,下面来具体说一下tm结构体类型。tm结构体类型把日期和时间以c结构体的形式封装了

            起来,里面包含了年、月、日、时、分、秒等。具体如下:

           struct tm

           {

               int tm_sec;    //秒,[0,59]

               int tm_min;//分钟,[0,59]

               int tm_hour;//小时,[0,23]

               int tm_year;//年,用的时候要加1900

               int tm_mon;//月,用的时候加1,因为范围是[0,11] 

               int tm_mday;  //日,[0,31]

               int tm_wday;//表示星期几,[0,6]

               int tm_isdst; //没用过,也没查过

           }

       (4) struct tm* gmtime(const time_t *time); 这个函数和第(3)个函数有点类似,只不过它是把日历时间转化为世界标准时间,其他的基本和第(3)个函数一样。

       (5) size_t strftime();有四个参数,该函数可用于格式化日期和时间为指定格式来输出。

       另外说一下,clock_t、time_t、size_t、tm这四个类型能把系统时间和日期表示为某种整数。下面是具体用法,还是上代码

    #include<iostream>
    #include<ctime>
    using namespace std;
    int main()
    {
        time_t t=time(0);   //返回自1970/01/01以来所经历的秒数
        char *pt=ctime(&t);
        tm *dt=localtime(&t);
        cout<<"所经历的秒数:"<<t<<"
    ";
        cout<<pt;   //以字符串的形式输出当地时间,格式为系统默认的
        cout<<"本地时间:    ";
        cout<<dt->tm_year<<"/"<<dt->tm_mon<<"/"<<dt->tm_mday<<"  星期"<<dt->tm_wday<<"  "; //输出结构体中的日期和时间
        cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"
    ";
        dt=gmtime(&t);
        cout<<"世界标准时间:";
        cout<<dt->tm_year<<"/"<<dt->tm_mon<<"/"<<dt->tm_mday<<"  星期"<<dt->tm_wday<<"  "; //输出结构体中的日期和时间
        cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"
    ";
        return 0;
    }

    运行结果如下:

    注意看本地时间与UTC的年和月是否和你电脑上的时间一样,还有本地时间和UTC是否相差8。既然本地时间的年和月与电脑上的时间不一样,那咋回事呢 ?

    前面我说过年和月在使用的时候要分别加1900、1。 就是这个:  int tm_year;//年,用的时候要加1900;int tm_mon;//月,用的时候加1,因为范围是[0,11] 

    所以只要把上面的程序改一下就好了,改好的程序如下

     1 #include<iostream>
     2 #include<ctime>
     3 using namespace std;
     4 int main()
     5 {
     6     time_t t=time(0);   //返回自1970/01/01以来所经历的秒数
     7     char *pt=ctime(&t);
     8     tm *dt=localtime(&t);
     9     cout<<"所经历的秒数:"<<t<<"
    ";
    10     cout<<pt;   //以字符串的形式输出当地时间,格式为系统默认的
    11     cout<<"本地时间:    ";
    12     cout<<dt->tm_year+1900<<"/"<<dt->tm_mon+1<<"/"<<dt->tm_mday<<"  星期"<<dt->tm_wday<<"  "; //输出结构体中的日期和时间
    13     cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"
    ";
    14     dt=gmtime(&t);
    15     cout<<"世界标准时间:";
    16     cout<<dt->tm_year+1900<<"/"<<dt->tm_mon+1<<"/"<<dt->tm_mday<<"  星期"<<dt->tm_wday<<"  "; //输出结构体中的日期和时间
    17     cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"
    ";
    18     return 0;
    19 }

    可以看出,在之前的程序的第12行和16行改了一下,加上了1900和1。运行结果如下:

    现在就没有错误了

    另外本文写的可能不够详细,可以看一下这个,写的比较详细:https://www.cnblogs.com/zhengfa-af/p/8312915.html

    写这篇文章我花了一下午的时间,最后还发生了一个插曲,就是在写到最后的时候,电脑卡住了,显示无响应,页面一直无法操作,等了一会还是不行,没办法只能重启,

    md心态爆炸,一下午白搞了,真的要被气死,不过晚上还是给搞完了,我感觉以后得用苹果的电脑了。

  • 相关阅读:
    关于const_cast
    TinyXPath与TinyXML
    C++的异常
    如何让对象只能处于堆中
    股票的委托价、成交价与成本价的关系
    static_cast dynamic_cast reinterpret_cast const_cast
    C++ MD5,SHA1源码下载和简单调用
    C++中char[]转string
    HttpWorker
    winnet winhttp
  • 原文地址:https://www.cnblogs.com/buanxu/p/12763581.html
Copyright © 2011-2022 走看看