小学期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; /* 秒 �C 取值区间为[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; /* 星期 �C 取值区间为[0,6],其中0代表星期天,1代表星期一,以此推 */ int tm_yday; /* 从每年的1月1日开始的天数 �C 取值区间为[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++$