#include "stdafx.h"
#include "HTime.h"
const int DateDelta = 693594;// Days between 1/1/0001 and 12/31/1899
const int HoursPerDay = 24;//hours per day
const int MinsPerHour = 60;//minutes per hour
const int SecsPerMin = 60;//seconds per minute
const int MSecsPerSec = 1000;//milliseconds per second
const double MinDateTime= -657434.0; // 01/01/0100 12:00:00.000 AM
const double MaxDateTime= 2958465.99999; // 12/31/9999 11:59:59.999 PM
//获取当前时间的年月日,小时,分钟,秒,以及毫秒
void DencoderNowTime(int & nYear,int & nMonth,int &nDay,int & nHour,int & nMin,int &nSec,int &nMSec)
{
SYSTEMTIME tTime;
GetLocalTime(&tTime);
nYear = tTime.wYear;
nMonth = tTime.wMonth;
nDay = tTime.wDay;
nHour = tTime.wHour;
nMin = tTime.wMinute;
nSec = tTime.wSecond;
nMSec = tTime.wMilliseconds;
return ;
}
TDateTime GetDate()
{
SYSTEMTIME tTime;
GetLocalTime(&tTime);
return EncodeDateTime(tTime.wYear,tTime.wMonth,tTime.wDay,0,0,0,0);
}
TDateTime GetNow()
{
SYSTEMTIME tTime;
GetLocalTime(&tTime);
return EncodeDateTime(tTime.wYear,tTime.wMonth,tTime.wDay,tTime.wHour,tTime.wMinute,tTime.wSecond,tTime.wMilliseconds);
}
string GetNowString()
{
SYSTEMTIME tTime;
GetLocalTime(&tTime);
char strTime[200] = {'\0'};
sprintf(strTime,"%04d-%02d-%02d %02d:%02d:%02d:%03d\0",
tTime.wYear,
tTime.wMonth,
tTime.wDay,
tTime.wHour,
tTime.wMinute,
tTime.wSecond,
tTime.wMilliseconds);
return std::string(strTime);
}
BOOL IsLeapYear(WORD Year)
{
return (((Year % 4) == 0) && ((Year % 100) != 0)) || ((Year % 400) == 0);
}
void DivMod(int dividend,int divisor,WORD *result,WORD *remainder)
{
*result=dividend/divisor;
*remainder=dividend%divisor;
}
//convert datetime to double type
TDateTime EncodeDateTime(WORD year,WORD month,WORD day,WORD hour,WORD min,WORD sec,WORD msec)
{
const int MinsPerDay = HoursPerDay * MinsPerHour;//minutes per day
const int SecsPerDay = MinsPerDay * SecsPerMin; //seconds per day
const int SecsPerHour = SecsPerMin * MinsPerHour; //seconds per hour
const int MSecsPerDay = SecsPerDay * MSecsPerSec; //milliseconds per day
int i;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
double date;
double time;
date=0;
time=0;
if ((year >= 1) && (year <= 9999) && (month >= 1) && (month <= 12))
{
//leap year
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) days[2]=29;
if ((day >= 1) && (day <= days[month]))
{
for( i=1;i<=month-1;i++) day+=days[i];
year-=1;
date= year * 365 + year / 4 - year / 100 + year / 400 + day - DateDelta;
if ((hour < HoursPerDay) && (min < MinsPerHour) && (sec < SecsPerMin) && (msec < MSecsPerSec))
{
time = (hour * (MinsPerHour * SecsPerMin * MSecsPerSec) + min * (SecsPerMin * MSecsPerSec) + sec * MSecsPerSec + msec);
time/=MSecsPerDay;
}
return date+time;
}
}
return 1; // 12/31/1899
}
void DecodeDateTime(TDateTime dt,WORD *year,WORD *month,WORD *day,WORD *hour,WORD *min,WORD *sec,WORD *msec)
{
const int MinsPerDay = HoursPerDay * MinsPerHour;//minutes per day
const int SecsPerDay = MinsPerDay * SecsPerMin; //seconds per day
const int SecsPerHour = SecsPerMin * MinsPerHour; //seconds per hour
const int MSecsPerDay = SecsPerDay * MSecsPerSec; //milliseconds per day
const int D1 = 365;
const int D4 = D1 * 4 + 1;
const int D100 = D4 * 25 - 1;
const int D400 = D100 * 4 + 1;
//
WORD y,m,d,r,temp;
WORD hh,mm,ss,mss;
char str[20]; //
int ipart;//integer part
double fpart;//float part
int date,time; //date and time
//int MinCount, MSecCount;
WORD MinCount, MSecCount;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ipart=0;
fpart=0;
y=0;m=0;d=0;r=0,temp=0;
hh=0;mm=0;ss=0;mss=0;
MinCount=0;
MSecCount=0;
if(!(dt< MinDateTime)||(dt >(int)MaxDateTime+1.0))
{
ipart=(int)(dt);
fpart=dt-ipart;
date=ipart+DateDelta;
time=(int)(MSecsPerDay*fpart);
//-------------------------decode date-------------------------
if (date<=0)
{
*year=1899;
*month=12;
*day=31;
*hour=0;
*min=0;
*sec=0;
*msec=0;
}
else
{
temp=date % 7 +1;
date-=1;
y=1;
while(date >= D400)
{
date-=D400;
y+=400;
}
DivMod(date,D100,&r,&d);
if (r==4)
{
r-=1;
d+=D100;
}
y+=r*100;
DivMod(d, D4, &r,&d);
y+=r*4;
DivMod(d,D1,&r,&d);
if (r==4)
{
r-=1;
d+=D1;
}
y+=r;
//leap year
if ((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))) days[2]=29;
m = 1;
while(1)
{
r=days[m];
if (d< r) break;
d-=r;
m+=1;
}
*year = y;
*month = m;
*day = d + 1;
}
DivMod(time, SecsPerMin * MSecsPerSec, &MinCount, &MSecCount);
DivMod(MinCount, MinsPerHour, &hh, &mm);
DivMod(MSecCount, MSecsPerSec, &ss, &mss);
*hour=hh;
*min=mm;
*sec=ss;
*msec=mss;
}
}
CString FormatDateTime(const char * cFormat,TDateTime dt)
{
CString sRet(cFormat);
SYSTEMTIME tTime;
DecodeDateTime(dt,&tTime.wYear,&tTime.wMonth,&tTime.wDay,&tTime.wHour,&tTime.wMinute,&tTime.wSecond,&tTime.wMilliseconds);
char Newchar[10];
sprintf(Newchar,"%04d\0",tTime.wYear);
sRet.Replace("YYYY",Newchar);
sprintf(Newchar,"%02d\0",tTime.wDay);
sRet.Replace("DD",Newchar);
sprintf(Newchar,"%02d\0",tTime.wMonth);
sRet.Replace("MM",Newchar);
sprintf(Newchar,"%02d\0",tTime.wHour);
sRet.Replace("HH",Newchar);
sprintf(Newchar,"%03d\0",tTime.wMilliseconds);
sRet.Replace("MLS",Newchar);
sprintf(Newchar,"%02d\0",tTime.wMinute);
sRet.Replace("MI",Newchar);
sprintf(Newchar,"%02d\0",tTime.wSecond);
sRet.Replace("SS",Newchar);
return sRet;
}
/* CDateTime类
*/
CHDateTime::CHDateTime()
{
m_DateTime = GetNow();
DecoderTime();
}
CHDateTime::CHDateTime(const TDateTime dt)
{
m_DateTime = dt;
DecoderTime();
}
CHDateTime::~CHDateTime()
{
}
CHDateTime & CHDateTime::operator =(const TDateTime dt)
{
m_DateTime = dt;
DecoderTime();
return *this;
}
CHDateTime::operator const TDateTime()
{
return m_DateTime;
}
bool CHDateTime::operator == (const TDateTime dt)
{
return ( m_DateTime == dt);
}
CHDateTime& CHDateTime::operator = (CHDateTime & cdt)
{
m_DateTime = cdt;
DecoderTime();
return *this;
}
void CHDateTime::DecoderTime()
{
DecodeDateTime(m_DateTime,&tTime.wYear,&tTime.wMonth,&tTime.wMonth,&tTime.wHour,&tTime.wMinute,&tTime.wSecond,&tTime.wMilliseconds);
}
DWORD CHDateTime::Year()
{
return tTime.wYear;
}
DWORD CHDateTime::Month()
{
return tTime.wMonth;
}
DWORD CHDateTime::Day()
{
return tTime.wDay;
}
DWORD CHDateTime::Hour()
{
return tTime.wHour;
}
DWORD CHDateTime::Minute()
{
return tTime.wMinute;
}
DWORD CHDateTime::Second()
{
return tTime.wSecond;
}
DWORD CHDateTime::MilliSeconds()
{
return tTime.wMilliseconds;
}
SYSTEMTIME CHDateTime::Time()
{
return tTime;
}
TDateTime CHDateTime::Date()
{
int nDay = int(m_DateTime);
return (double)nDay;
}
CString CHDateTime::ToString(const char * cFormat)
{
return FormatDateTime(cFormat,m_DateTime);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
VC在处理时间差时,比较烦琐。学习DELPHI的方法,以一个DOUBLE值来表示时间,这样很容易算出两者的时间差等信息。同时具有一个将时间转为字符串的函数,方便调用。 同时包含一个CHDateTime类,便于使用。 C++中的std::string功能强大,一般在可以情况的都使用string; MFC中的CString功能更为强大,如果string实现不了部分,使用CString来实现。
资源推荐
资源详情
资源评论
收起资源包目录
HTime.rar (2个子文件)
HTime.h 2KB
HTime.cpp 7KB
共 2 条
- 1
资源评论
- Wade_Song2015-11-20感谢楼主的分享,很实在。
- 时间的流失2017-09-03good......................................................................................................
- longlongflower2018-03-28谢谢楼主,很实用
- chenjiang06112016-04-11是对的,我测试过了
jinfei1976
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功