首页 > 代码库 > 14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录

14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录

    小学期C++课程设计需要做一个图书馆管理系统,需要获取当前时间和进行时间运算,在网上找了些资料自学了一下,总结如下:


1.获取日历时间:

        C++中时间原型为日历时间(Calender Time),表示当前时间和某一固定时间相差的秒数。

        定义如下:

            #typedef long time_t;

        也就是说,日历时间实际上是一个长整形的数据。使用time()函数获取当前的日历时间,

             time_t time(NUL);

        其返回值就是当前的日历时间。

 

2.将日历时间(time_t)转化为tm类型的时间:

          把日历时间转化为常用的年-月-日,时-分-秒的时间需要调用localtime(time_t * timer)来将time表示的时间转化为一个tm的结构体,localtime()函数,tm结构体定义如下:            

        struct tm * gmtime(const time_t *timer);                                           
        struct tm * localtime(const time_t * timer); 
        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;    /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ 
             };


           

           另外,使用mktime()函数可以把一个tm结构体数据转化成一个t_time的长整形,可以通过这个函数补全日期中不完整的部分并且输出,例如以下程序用于计算1997年7月1日是星期几:

#include "time.h" 
#include "stdio.h" 
#include "stdlib.h" 
int main(void) 
{ 
     struct tm t; 
     time_t t_of_day; 
     t.tm_year=1997-1900; 
     t.tm_mon=6; 
     t.tm_mday=1; 
     t.tm_hour=0; 
     t.tm_min=0; 
     t.tm_sec=1; 
     t.tm_isdst=0; 
     t_of_day=mktime(&t); 
     printf(ctime(&t_of_day)); 
     return 0; 
}


运行结果: 

Tue Jul 01 00:00:01 1997


3.时间的输入输出:

         tm结构体不能直接输出,time.h中有库函数将time_t和tm类型的变量转化为固定格式的字符串,分别是:

        char * asctime(const struct tm * timeptr); 
        char * ctime(const time_t *timer);

      假设t是一个非空的t_time变量,则asctime()和ctime()函数的联系如下:

        printf(ctime(&t));         
        //等价于: 
        struct tm *ptr; 
        ptr=localtime(&t); 
        printf(asctime(ptr));

 

4.自定义格式化输出时间:

       通过使用strftime()函数向输出流输出一个自定义格式的时间字符串,该函数原型如下:            

size_t strftime( 
    char *strDest, 
    size_t maxsize,
    const char *format, 
    const struct tm *timeptr  
);

        函数的作用是将timeptr指向的tm结构体中时间的内容,根据format字符串中指定的格式,输出到strDest之中,maxsize表示输出最大字符数(防止溢出)。

        其中,format中格式转意字符如下:        

            %a 星期几的简写

            %A 星期几的全称  

            %b 月分的简写  

            %B 月份的全称  

            %c 标准的日期的时间串  

            %C 年份的后两位数字  

            %d 十进制表示的每月的第几天  

            %D 月/天/年  

            %e 在两字符域中,十进制表示的每月的第几天  

            %F 年-月-日  

            %g 年份的后两位数字,使用基于周的年  

            %G 年分,使用基于周的年  

            %h 简写的月份名  

            %H 24小时制的小时  

            %I 12小时制的小时 

            %j 十进制表示的每年的第几天  

            %m 十进制表示的月份  

            %M 十时制表示的分钟数  

            %n 新行符  

            %p 本地的AM或PM的等价显示  

            %r 12小时的时间  

            %R 显示小时和分钟:hh:mm  

            %S 十进制的秒数  

            %t 水平制表符  

            %T 显示时分秒:hh:mm:ss  

            %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0) 

            %U 第年的第几周,把星期日做为第一天(值从0到53) 

            %V 每年的第几周,使用基于周的年  

            %w 十进制表示的星期几(值从0到6,星期天为0) 

            %W 每年的第几周,把星期一做为第一天(值从0到53)  

            %x 标准的日期串  

            %X 标准的时间串  

            %y 不带世纪的十进制年份(值从0到99) 

            %Y 带世纪部分的十进制年份  

            %z,%Z 时区名称,如果不能得到时区名称则返回空字符。 

            %% 百分号 

                    

4.计算时间跨度:

        可以使用difftime()函数计算两个时间之间的跨度,其函数原型如下:

double difftime(time_t end, time_t start);

        其实他就是用两个时间相减实现的。


5.一个自己写的实验程序:

#include <time.h>
#include <stdio.h>
using namespace std;


int main()
{
    time_t tm1;
    time(&tm1);                //获得日历时间
    tm *tm_s;
    char str[40];
    char temps[40];
    char temps1[40];


    tm_s=localtime(&tm1);            //日历时间转换为tm时间
    printf("Local hour is: %d\n",tm_s->tm_hour);            //输出结构体成员
    tm_s=gmtime(&tm1);
    printf("UTC hour is: %d\n",tm_s->tm_hour);

    printf(asctime(tm_s));          //输出固定完整格式的时间字符串
// &(temps[0])=ctime(&tm1);   //错误提示:/home/al/Desktop/c++/test_time.cpp|22|error: incompatible types in assignment of ‘char*’ to ‘char [40]’|
    printf(ctime(&tm1));        //asctime输出的是本地时间,ctime输出的是格林尼治时间
                                           //另外ctime的参数是一个time_t即日历时间的一个指针
                                           //另外如果需要使用字符串保存,必须使用非数组的指向char的指针(我不知道为什么。)
                                     //难道c++里面字符数组的名字不再表示字符数组的首地址了?


    strftime(str,40,"DATE:%A     %p %I",tm_s);    //输出自定义格式的字符串
    printf("%s\n",str);
}

运行结果:

al@ubuntu:~/Desktop/c++$ ./test_time 

Local hour is: 12

UTC hour is: 4

Fri Sep 12 04:10:20 2014

Fri Sep 12 12:10:20 2014

DATE:Friday     PM 12

al@ubuntu:~/Desktop/c++$ 


本文出自 “aL的自学记录” 博客,请务必保留此出处http://al0707.blog.51cto.com/9215022/1551527

14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录