【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;
}
时间: 2024-10-02 06:45:58

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

标准模板库中的向量(vector)

//C++数据结构与算法(第4版) Adam Drozdek 著  徐丹  吴伟敏<<清华大学出版社>> 向量是最简单的STL容器,其数据结构与数组类似,占据着一个连续的内存块.由于内存位置是连续的,所以向量中的元素可以随机访问,访问向量中任何一个元素的时间也是固定的.存储空间的管理是自动的,当要将一个元素插入到已满的向量中时,会为向量分配一个更大的内存块,将向量中的元素复制进新的内存块,然后释放旧的内存块.所以,向量是一个灵活的数组,是能够动态改变自身大小的数组. vector(

标准模板库中的优先队列(priority_queue)

//C++数据结构与算法(第4版) Adam Drozdek 著  徐丹  吴伟敏<<清华大学出版社>> #include<queue> priority_queue(comp f()) //创建一个空的优先队列,使用一个双变量的布尔函数f对队列中的元素排序 priority_queue(iterator first, iterator last,comp()) //创建一个优先队列,使用一个双变量的布尔函数f对队列中的元素排序:队列初始化为迭代器first和last之

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

C++标准模板库之vector(Boolan)

vector是C++标准模板库中一种常见的容器,像数组类似,vector使用连续的存储空间用来保存元素,使用指针偏移可以快速的访问元素(通常认为是O1复杂度),与数组不同的是它的大小是可变的,在vector内部使用动态分配的内存保存元素,这意味着vector增长时需要重新分配内存,并将原来的原来的数据复制到该内存单元,需要很大的开销,因此vector并不会在每次新增元素时候都重新分配内存空间.vector实际容量(capacity)通常比实际大小(size)大得多.参考数据结构(C++语言版),

JSP 标准标签库(JSTL)

JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签. 根据JSTL标签所提供的功能,可以将其分为5个类别. 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 JSTL 库安装 Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

jsp标准标签库——jstl

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签. 根据JSTL标签所提供的功能,可以将其分为5个类别. 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 JSTL 库安装 Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-tag