一个好用的日期时间类(c++)


/**********************************************************/
//name          : datetime.h
//function      : 时间日期类的定义
//copyright     :
//author        :
//date          : 2007-08-27
/**********************************************************/
#ifndef DATETIME_H_INCLUDE_
#define DATETIME_H_INCLUDE_
#include <time.h>
#include <sys/timeb.h>
#include <string>

class CDateTime
{
private:
 bool m_millisecondflag;
 struct timeb tp;
 time_t m_tTime;
 struct tm m_stTime;
public:
 CDateTime();
 CDateTime(time_t tTime);
    CDateTime(const struct tm& stTime);
 CDateTime(int iYear,int iMonth,int iDay,int iHour = 0,int iMinute = 0,int iSecond = 0);
 time_t GetValue();
    const struct tm& GetStruct();
 int Year();
 int Month();
 int Day();
 int Hour();
 int Minute();
 int Second();
 int DayOfWeek();
 int DayOfYear();
 int MilliSecond();
 //最大支持到差异 1000 * 61 * 60 毫秒
 int SubMilliSecond(CDateTime &dt);
 const std::string ShortDateTime();
 const std::string LongDateTime(char chSep1 = '-',char chSep2 = ':');
 const std::string LongDateTimeWithMilliSec(char chSep1 = '-',char chSep2 = ':');
 const std::string ShortDate();
 const std::string LongDate(char chSep = '-');

//增加或者减少几个自然月
 const std::string GetNewDateByMonth(int newmonth);
 //增加或者减少几天
 const std::string GetNewDateByDay(int newday);
};
#endif

 


/**********************************************************/
//name          : datetime.cpp
//function      : 时间日期类的实现
//copyright     :
//author        :
//date          : 2007-08-27
/**********************************************************/

#include <stdio.h>
#include "datetime.h"
using namespace std;

CDateTime::CDateTime():m_millisecondflag(true)

 ftime(&tp);
 m_tTime = tp.time;
#ifdef WIN32
 struct tm * ptr = localtime(&m_tTime);
 if(ptr)
 {
  m_stTime = *ptr;
 }
#else
 localtime_r(&m_tTime,&m_stTime);
#endif
}

CDateTime::CDateTime(time_t tTime):m_millisecondflag(false)
{
 m_tTime = tTime;
#ifdef WIN32
 struct tm * ptr = localtime(&m_tTime);
 if(ptr)
 {
  m_stTime = *ptr;
 }
#else
 localtime_r(&m_tTime,&m_stTime);
#endif
}

CDateTime::CDateTime(const struct tm& stTime):m_millisecondflag(false)
{
 m_stTime = stTime;
 m_tTime = mktime(&m_stTime);
}

CDateTime::CDateTime(int iYear,int iMonth, int iDay,
      int iHour,int iMinute,int iSecond)
      :m_millisecondflag(false)
{
 m_stTime.tm_year = iYear - 1900;
 m_stTime.tm_mon = iMonth - 1;
 m_stTime.tm_mday = iDay;
 m_stTime.tm_hour = iHour;
 m_stTime.tm_min = iMinute;
 m_stTime.tm_sec = iSecond;
 m_tTime = mktime(&m_stTime);
}

const std::string CDateTime::ShortDateTime()
{
 char sDateTime[15] = {0};
 sprintf(sDateTime,"%04d%02d%02d%02d%02d%02d",
  Year(),Month(),Day(),Hour(),Minute(),Second());
 return string(sDateTime);
}

const std::string CDateTime::LongDateTime(char chSep1,char chSep2)
{
 char sDateTime[20] = {0};
 sprintf(sDateTime,"%04d%c%02d%c%02d %02d%c%02d%c%02d",
  Year(),chSep1,Month(),chSep1,Day(),
  Hour(),chSep2,Minute(),chSep2,Second());
 return string(sDateTime);
}

const std::string CDateTime::LongDateTimeWithMilliSec(char chSep1,char chSep2)
{
 char sDateTime[30] = {0};
 sprintf(sDateTime,"%04d%c%02d%c%02d %02d%c%02d%c%02d%c%03d",
  Year(),chSep1,Month(),chSep1,Day(),
  Hour(),chSep2,Minute(),chSep2,Second(),chSep2,MilliSecond());
 return string(sDateTime);
}

const std::string CDateTime::ShortDate()
{
 char sDate[9] = {0};
 sprintf(sDate,"%04d%02d%02d",Year(),Month(),Day());
 return string(sDate);
}

const std::string CDateTime::LongDate(char chSep)
{
 char sDate[11] = {0};
 sprintf(sDate,"%04d%c%02d%c%02d",Year(),chSep,Month(),chSep,Day());
 return string(sDate);
}

time_t CDateTime::GetValue()
{
 return m_tTime;
}

inline const struct tm& CDateTime::GetStruct()

 return m_stTime;
}

inline int CDateTime::Year()
{
 return m_stTime.tm_year + 1900;
}

inline int CDateTime::Month()
{
 return m_stTime.tm_mon + 1;
}

inline int CDateTime::Day()
{
 return m_stTime.tm_mday;
}

inline int CDateTime::Hour()
{
 return m_stTime.tm_hour;
}

inline int CDateTime::Minute()
{
 return m_stTime.tm_min;
}

inline int CDateTime::Second()
{
 return m_stTime.tm_sec;
}

inline int CDateTime::DayOfWeek()
{
 return m_stTime.tm_wday;
}

inline int CDateTime::DayOfYear()
{
 return m_stTime.tm_yday;
}

inline int CDateTime::MilliSecond()
{
 return m_millisecondflag?tp.millitm:0;
}

int CDateTime::SubMilliSecond(CDateTime &dt)
{
 if(m_millisecondflag == false)
 {
  return 0;
 }

 int millisecnds = 0;
 if(this->GetValue() >= dt.GetValue())
 {
  millisecnds = (int)(GetValue() - dt.GetValue()) * 1000;
 }

 if(millisecnds > 1000 * 61 * 60)
 {
  millisecnds = 0;
 }

 millisecnds += MilliSecond() - dt.MilliSecond();

 return m_millisecondflag?millisecnds:0;
}

 

//增加或者减少几个自然月
const std::string CDateTime::GetNewDateByMonth(int newmonth)
{
 int month = this->Month();
 int year = this->Year();
 month += newmonth;
 if(month % 12 == 0)
 {  
  year += month%12 - 1;
  month = 12;
 }
 else
 {
  year += month/12;
  month = month%12;
 }

 int day = this->Day();
 //校验本月是否有该天
 while(day > 0)
 {
  CDateTime dt(year,month,day);
  if(dt.Day() == day)
  {
   m_tTime = dt.GetValue();
   m_stTime = dt.GetStruct();
   break;
  }
  day--;
 }
 return this->LongDate();
}

//增加或者减少几天
const std::string CDateTime::GetNewDateByDay(int newday)
{
 m_tTime += newday * 86400;
 #ifdef WIN32
 struct tm * ptr = localtime(&m_tTime);
 if(ptr)
 {
  m_stTime = *ptr;
 }
#else
 localtime_r(&m_tTime,&m_stTime);
#endif
 
 return this->LongDate();
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值