C++每日練筆之日期類(基類)

在個人命名空間TYCppStdLib中對於日期和時間的操做很是豐富。
共有六個類和一組全局函數。
六個類分別是:
CDate
CTime
CDateAndTime
CMyDate
CMyTime
CMyDateAndTime

前三個類不帶類的成員變量,直接操做用戶給定的數據。
前三個類的成員函數與全局函數一一對應。
後三個類帶類的成員變量,成員函數操做類的成員變量。

如今發佈的是CDate類(基類,完成基本功能,待更新)。

/*- ==========================================================
*     文件名  :CDate.h
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-04-23
*     修改時間:2012-05-01
*     功能說明:日期類(基類)
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 2011118
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#ifndef CDate_H_TYCppStdLib
#define CDate_H_TYCppStdLib

#ifdef CDate_DLL_API
#else
#define CDate_DLL_API _declspec(dllimport)
#endif

#include <string>
#include "Windows.h"

using namespace std;

namespace TYCppStdLib
{   
    class CDate_DLL_API CDate
    {
    public:
        CDate();
        virtual ~CDate();
        
        virtual int GetYear();   // 獲取年
        virtual int GetMonth();  // 獲取月
        virtual int GetDay();    // 獲取日
        
        virtual bool SetYear(int year);    // 設置年
        virtual bool SetMonth(int month);  // 設置月
        virtual bool SetDay(int day);      // 設置日
        
        // 獲取日期
        virtual void GetDate(int &year,int &month,int &day);
        //virtual string GetDate(const string strDivide="-");
        //virtual void GetDate(char *dates,char *divide="-");
        //virtual void GetDate(CMyDate &ob);
        
        // 設置日期
        virtual bool SetDate(int year,int month,int day); 
        //virtual bool SetDate(char *dates);
        
        // 檢查日期是否合法
        virtual bool DateIsValid(int year,int month,int day);
        // 判斷閏年
        virtual bool IsLeapYear(int year=0);  
        // 計算某年天數
        virtual int GetDaysOfYear(int year=0); 
        //計算某年某月天數
        virtual int GetDaysOfMonth(int year=0,int month=0);
        // 獲取本年已過天數
        virtual int GetDaysOver(int year,int month,int day);
    };
}

#endif

/*- ==========================================================
*     文件名  :CDate.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-04-23
*     修改時間:2012-05-01
*     功能說明:日期類(基類)
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 2011118
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#ifndef CDate_DLL_ForAPI
#define CDate_DLL_ForAPI

#define CDate_DLL_API _declspec(dllexport)

#endif

#include "../../Include/DateAndTime/CDate.h"
//#include "stdio.h"
// #include <cstdio>
//#include "string.h"
// #include <cstring>
// #include <cstdlib>
//using std::sprintf;
// using std::strcat;
// using std::strcpy;

/*     typedef struct _SYSTEMTIME { // st 
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
    } SYSTEMTIME; */

//構造函數
TYCppStdLib::CDate::CDate()
{
    //空函數
}

//析構函數
TYCppStdLib::CDate::~CDate()
{
    //空函數
}

// 獲取年
int TYCppStdLib::CDate::GetYear()
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    return st.wYear;
}
 
// 獲取月  
int TYCppStdLib::CDate::GetMonth()
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    return st.wMonth;
}
 
// 獲取日 
int TYCppStdLib::CDate::GetDay()
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    return st.wDay;
}

// 設置年
bool TYCppStdLib::CDate::SetYear(int year)
{
    SYSTEMTIME st;
    if(year<1970)
        return false;
    GetLocalTime(&st);
    st.wYear=year;
    if(SetLocalTime(&st))
        return true;
    return false;
}

// 設置月    
bool TYCppStdLib::CDate::SetMonth(int month)
{
    SYSTEMTIME st;
    if(month<1 || month>12)
        return false;
    GetLocalTime(&st);
    st.wMonth=month;
    if(SetLocalTime(&st))
        return true;
    return false;
}
  
// 設置日
bool TYCppStdLib::CDate::SetDay(int day)
{
    SYSTEMTIME st;
    int t;
    GetLocalTime(&st);
    t=GetDaysOfMonth();
    if(day<1 || day>t)
        return false;
    st.wDay=day;
    if(SetLocalTime(&st))
        return true;
    return false;
}
  
// 獲取日期  
void TYCppStdLib::CDate::GetDate(int &year,int &month,int &day)
{
    year=GetYear();
    month=GetMonth();
    day=GetDay();
}
  
 // void TYCppStdLib::CDate::GetDate(char *dates,char *divide="-")
// {
    // int year, month, day;
    // char *cyear, *cmonth ,*cday;
    // year=GetYear();
    // month=GetMonth();
    // day=GetDay();
    
     // strcpy(dates,year,4,RIGHTSIDE,'0',divide);
    // strcat(dates,month,2,RIGHTSIDE,'0',divide);
    // strcat(dates,day,2,RIGHTSIDE,'0'); 
    
     // sprintf(cyear, "%d", year);
    // sprintf(cmonth, "%d", month);
    // sprintf(cday, "%d", day);

    // itoa(year, cyear, 10);
    // itoa(month, cmonth, 10);
    // itoa(day, cday, 10);
    
    // strcpy(dates, cyear);
    // strcat(dates, divide);
    // strcat(dates, month);
    // strcat(dates, divide);
    // strcat(dates, day);
// }

// void TYCppStdLib::CDate::GetDate(CDate &ob)
// {

// } 
    
// 設置日期  
bool TYCppStdLib::CDate::SetDate(int year,int month,int day)
{
    if(!SetYear(year))
        return false;
    if(!SetMonth(month))
        return false;
    return SetDay(day);
}
 
// bool TYCppStdLib::CDate::SetDate(char *dates)
// {

// }

// 檢查日期是否合法                 
bool TYCppStdLib::CDateAndTime::DateIsValid(int year,int month,int day)
{
    if(year<0 || day<1)
        return false;
    if(month<1 || month>12)
        return false;
    int MaxDay=GetDaysOfMonth(year, month);
    if(day>MaxDay)
        return false;
    return true;
}

// 判斷閏年
bool TYCppStdLib::CDateAndTime::IsLeapYear(int year)
{
    if(year<0)
        return false;
    if(!year)
    {
        SYSTEMTIME st;
        GetLocalTime(&st);
        year=st.wYear;
    }
    if((year%4==0 && year%100!=0) || year%400==0)
        return true;
    return false;
}

// 計算某年天數
int TYCppStdLib::CDateAndTime::GetDaysOfYear(int year)
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    if(!year)
        year=st.wYear;
    if(year<0)
        return 0;//return false;
    if(IsLeapYear(year))
        return 366;
    else
        return 365;
}

//計算某年某月天數
int TYCppStdLib::CDateAndTime::GetDaysOfMonth(int year,int month)
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    int day, leap;
    if(!month)
        month=st.wMonth;
    if(!year)
        year=st.wYear;
    if(year<1970)
        return 0;//return false;
    if (month<1 || month>12)
        return 0;//return false;
    if(IsLeapYear(year))
        leap=1;
    else
        leap=0;
    day=31;     //默認31天
    switch (month)
    {
        case 4:
        case 6:
        case 9:
        case 11:
            day=30;
            break;
        case 2:
            day=28+leap;
            break;
    }
    return day;
}
相關文章
相關標籤/搜索