首页 > 代码库 > 【ThinkingInC++】48、用标准C库中的时间函数生成简单的Time类

【ThinkingInC++】48、用标准C库中的时间函数生成简单的Time类

Cpptime.h


/**
* 书本:【ThinkingInC++】
* 功能:用标准C库中的时间函数生成简单的Time类
* 时间:2014年9月11日07:53:56
* 作者:cutter_point
*/
#ifndef CPPTIME_H_INCLUDED
#define CPPTIME_H_INCLUDED

#include<ctime>
#include<cstring>
//这里ctime和cstring是不包含using namespace std;的而后面加.h是C中的,是包含using namespace std;的

/*
而直接存储年月日的是一个结构:
struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*
    int tm_min;  /*分钟,0-59*
    int tm_hour; /*小时, 0-23*
    int tm_mday; /*日,即一个月中的第几天,1-31*
    int tm_mon;  /*月, 从一月算起,0-11*/  /*1+p->tm_mon;
    int tm_year;  /*年, 从1900至今已经多少年*  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*
    int tm_isdst; /*日光节约时间的旗标*
};
*/

#include<iostream>

class Time
{
    std::time_t t;  //time_t是一个类型time_t 这种类型就是用来存储从1970年到现在经过了多少秒
    std::tm local;  //tm是一个结构
    char asciiRep[26];
    unsigned char lflag, aflag;
    void updateLocal()
    {
        if(!lflag)
        {
            /*
            struct tm* gmtime(const time_t *timep);
            将time_t表示的时间转换为没有经过时区转换的时间,是一个struct tm结构指针,
            struct tm* localtime(const time_t *timep);
            和gmtime类似,但是它是经过时区转换的时间。
            time_t 这种类型就是用来存储从1970年到现在经过了多少秒
            这个函数就是把秒转换成我们看得懂的时间
            */
            local=*std::localtime(&t);
            ++lflag;
        }
    }
    void updateAscii()
    {
        if(!aflag)
        {
            updateLocal();
            /*
            char *asctime(const struct tm* timeptr);
            将结构中的信息转换为真实世界的时间,以字符串的形式显示
            strcpy(char*, string/char*)
            将第二个字符串拷贝到第一个上面
            */
            //        std::cout<<"???"<<std::endl;
            std::strcpy(asciiRep, std::asctime(&local));
            ++aflag;
        }
    }
public:
    Time() {mark(); }

    void mark()
    {
        lflag=aflag=0;
        std::time(&t);  //得到系统地时间time_t time(time_t *t);取得从1970年1月1日至今的秒数。
    }

    const char* ascii() //返回一个const char*类型的数据
    {

        updateAscii();
        return asciiRep;
    }

    int delta(Time* dt) const   //这个const表示这个函数不能改变类的成员数据
    {
        /*
        oubledifftime(time_t time1, time_t time2);
        返回两个时间相差的秒数
        */
        return int(std::difftime(t, dt->t));
    }

    int daylightSaving()
    {
        updateLocal();
        //int tm_isdst; //日光节约时间的旗标
        return local.tm_isdst;
    }

/*
而直接存储年月日的是一个结构:
struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*
    int tm_min;  /*分钟,0-59*
    int tm_hour; /*小时, 0-23*
    int tm_mday; /*日,即一个月中的第几天,1-31*
    int tm_mon;  /*月, 从一月算起,0-11*/  /*1+p->tm_mon;
    int tm_year;  /*年, 从1900至今已经多少年*  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*
    int tm_isdst; /*日光节约时间的旗标*
};
*/
    int dayOfYear()
    {
        //    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*
        updateLocal();
        return local.tm_yday;
    }

    int dayOfWeek()
    {
        //    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*
        updateLocal();
        return local.tm_wday;
    }

    int since1900()
    {
        //    int tm_year;  /*年, 从1900至今已经多少年*  1900+ p->tm_year;
        updateLocal();
        return local.tm_year;
    }

    int month()
    {
        //    int tm_mon;  /*月, 从一月算起,0-11*/  /*1+p->tm_mon;
        updateLocal();
        return local.tm_mon;
    }

    int dayOfMonth()
    {
       //     int tm_mday; /*日,即一个月中的第几天,1-31
        updateLocal();
        return local.tm_mday;
    }

    int hour()
    {
        //    int tm_hour; /*小时, 0-23*
        updateLocal();
        return local.tm_hour;
    }

    int minute()
    {
        //    int tm_min;  /*分钟,0-59*
        updateLocal();
        return local.tm_min;
    }

    //    int tm_sec;  /*秒,正常范围0-59, 但允许至61*
    int second()
    {
        updateLocal();
        return local.tm_sec;
    }

};


#endif // CPPTIME_H_INCLUDED


Cpptime.cpp


/**
* 书本:【ThinkingInC++】
* 功能:测试C++时间类
* 时间:2014年9月11日07:54:38
* 作者:cutter_point
*/

#include"Cpptime.h"
#include<iostream>

using namespace std;

int main()
{
    Time start;

    for(int i=1 ; i<5000 ; ++i)
    {
        cout<<i<<' ';
        if(i%10 == 0)
            cout<<endl;
    }

    Time end;
    cout<<endl;
    cout<<"start = "<<start.ascii()<<endl;
    cout<<"end = "<<end.ascii()<<endl;
    cout<<"delta = "<<end.delta(&start)<<endl;

    return 0;
}






【ThinkingInC++】48、用标准C库中的时间函数生成简单的Time类