用struct tm与time_t来计算日期之间的间隔天数

时间:2021-08-15 23:43:35

使用标准库提供的struct tm类型的变量与time_t类型的变量,可以比较方便地处理时间。

写了个处理时间的class

用到了下面的struct tm结构体和time_t类型的变量。

 

1. struct tm

在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:

#ifndef_TM_DEFINED
structtm {
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()为负。*/
};
#define_TM_DEFINED
#endif

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)

 

2. time_t

time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数:

doubledifftime(time_t time1, time_t time0);
time_tmktime(struct tm * timeptr);
time_ttime(time_t * timer);
char* asctime(const struct tm * timeptr);
char* ctime(const time_t *timer);

time_t表示的时间(日历时间)是从一个时间点(197011000秒)到此时的秒数。

time.h中可以看到time_t是一个长整型数:

#ifndef_TIME_T_DEFINED
typedeflong time_t;
#define_TIME_T_DEFINED
#endif


3. 自定义的class,用来计算两天之间的间隔天数。

2012060120120604这两天之间的间隔天数为3天。

头文件,DateOffset.h

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <stdio.h>
#include <time.h>
using namespace std;

#ifndef DATEOFFSET_H
#define DATEOFFSET_H

class DateOffset
{
public:
DateOffset(){}
~DateOffset(){}
int time_gap(int date1, int date2);
time_t time_maker(int date);
int current_time(time_t& current_time);
protected:
struct tm t;
time_t t_of_day1,t_of_day2;
};
#endif

CPP文件,DateOffset.cpp

#include <iostream>
#include "./DateOffset.h"
using namespace std;

int DateOffset::time_gap(int date1, int date2)
{
t_of_day1=time_maker(date1);
t_of_day2=time_maker(date2);
double diff = difftime (t_of_day1,t_of_day2);
if(diff<0)
diff=0-diff;
//60*60*24=86400
int count_gap_day=(int)diff/86400;
return count_gap_day;
}

time_t DateOffset::time_maker(int date)
{
t.tm_year=date/10000-1900;
t.tm_mon=(date-(t.tm_year+1900)*10000)/100-1;
t.tm_mday=date-(t.tm_year+1900)*10000-(t.tm_mon+1)*100;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
time_t t_of_day=mktime(&t);
return t_of_day;
}

int DateOffset::current_time(time_t& currenttime)
{
struct tm * timeinfo;
timeinfo=localtime(¤ttime);
int year=timeinfo->tm_year+1900;
int month=timeinfo->tm_mon+1;
int day=timeinfo->tm_mday;
int date_current=year*10000+month*100+day;
return date_current;
}