最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是VC++的源码。
//
把GMT时间的秒数转换成日期时间格式
CTime GetGMTDateTime( long Value)
... {
//GMT时间从1970年1月1日开始,先把它作为赋为初值
int Year=1970, Month=1, Day=1;
int Hour=0, Min=0, Sec=0, MSec=0;
//临时变量
int iYear=0, iDay=0;
int iHour=0, iMin=0, iSec=0;
//计算文件创建的年份
iYear=Value / (365*24*60*60);
Year=Year+iYear;
//计算文件除创建整年份以外还有多少天
iDay=(Value % (365*24*60*60)) / (24*60*60);
//把闰年的年份数计算出来
int RInt=0;
for(int i=1970;i<Year;i++)
...{
if((i % 4)==0)
RInt=RInt+1;
}
//计算文件创建的时间(几时)
iHour=((Value % (365*24*60*60)) % (24*60*60)) / (60*60);
Hour=Hour+iHour;
//计算文件创建的时间(几分)
iMin=(((Value % (365*24*60*60)) % (24*60*60)) % (60*60)) / 60;
Min=Min+iMin;
//计算文件创建的时间(几秒)
iSec=(((Value % (365*24*60*60)) % (24*60*60)) % (60*60)) % 60;
Sec=Sec+iSec;
CTime t(Year,Month,Day,Hour,Min,Sec);
CTime t1;
t1=t+(iDay-RInt)*24*60*60;
return t1;
}
// 调用
void CGMTProDlg::OnOK()
... {
CTime t1;
//708992537为秒数
t1=GetGMTDateTime(708992537);
char RDate[20]=...{0};
char RTime[20]=...{0};
//分离出日期
wsprintf(RDate,"%04u-%02u-%02u",t1.GetYear(),t1.GetMonth(),t1.GetDay());
//分离出时间
wsprintf(RTime,"%02u:%02u:%02u",t1.GetHour(),t1.GetMinute(),t1.GetSecond());
//把日期和时间显示出来
m_Date=RDate;
m_Time=RTime;
UpdateData(FALSE);
}
CTime GetGMTDateTime( long Value)
... {
//GMT时间从1970年1月1日开始,先把它作为赋为初值
int Year=1970, Month=1, Day=1;
int Hour=0, Min=0, Sec=0, MSec=0;
//临时变量
int iYear=0, iDay=0;
int iHour=0, iMin=0, iSec=0;
//计算文件创建的年份
iYear=Value / (365*24*60*60);
Year=Year+iYear;
//计算文件除创建整年份以外还有多少天
iDay=(Value % (365*24*60*60)) / (24*60*60);
//把闰年的年份数计算出来
int RInt=0;
for(int i=1970;i<Year;i++)
...{
if((i % 4)==0)
RInt=RInt+1;
}
//计算文件创建的时间(几时)
iHour=((Value % (365*24*60*60)) % (24*60*60)) / (60*60);
Hour=Hour+iHour;
//计算文件创建的时间(几分)
iMin=(((Value % (365*24*60*60)) % (24*60*60)) % (60*60)) / 60;
Min=Min+iMin;
//计算文件创建的时间(几秒)
iSec=(((Value % (365*24*60*60)) % (24*60*60)) % (60*60)) % 60;
Sec=Sec+iSec;
CTime t(Year,Month,Day,Hour,Min,Sec);
CTime t1;
t1=t+(iDay-RInt)*24*60*60;
return t1;
}
// 调用
void CGMTProDlg::OnOK()
... {
CTime t1;
//708992537为秒数
t1=GetGMTDateTime(708992537);
char RDate[20]=...{0};
char RTime[20]=...{0};
//分离出日期
wsprintf(RDate,"%04u-%02u-%02u",t1.GetYear(),t1.GetMonth(),t1.GetDay());
//分离出时间
wsprintf(RTime,"%02u:%02u:%02u",t1.GetHour(),t1.GetMinute(),t1.GetSecond());
//把日期和时间显示出来
m_Date=RDate;
m_Time=RTime;
UpdateData(FALSE);
}