struct tmとtimeでtは、日付間の間隔日数を計算する

2930 ワード

標準ライブラリで提供されるstruct tmタイプの変数とtime_を使用tタイプの変数は、時間を比較的便利に処理できます.
処理時間のclassを書きました.
次のstruct tm構造体とtime_を用いた.tタイプの変数.
 
1. struct tm
標準C/C++では、timeにおけるtm構造により日付と時間を得ることができる.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が示す時間(カレンダー時間)は、1つの時点(1970年1月1日0時0分0秒)からその時点までの秒数である.
time.hでtime_が見えますtは長い整数です.
#ifndef_TIME_T_DEFINED
typedeflong time_t;
#define_TIME_T_DEFINED
#endif

3.2日間の間隔日数を計算するカスタムclass.
例えば20120601と20120604の2日間の間隔日数は3日間である.ヘッダファイルh
#include 
#include 
#include 
#include 
#include 
#include 
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 
#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;
}