时间转换问题

来源:互联网 发布:angularjs post json 编辑:程序博客网 时间:2024/05/18 02:36

//dtmfnct.h 

//char=8bt 

//int=32bt 

//pure c ++ code 

#ifndef dtmfnctH 

#define dtmfnctH 

#include <math.h> 

//------------------------------------------------------------------------ 

int __fastcall strTOdate(char *); 

int __fastcall ymdTOdate(int, int, int); 

int __fastcall dateTOymd(int &, int &, int &, int); 

//--------//--------//--------//--------//--------//-------- 

int __fastcall strTOtime(char *); 

int __fastcall hmsTOtime(int, int, int); 

int __fastcall timeTOhms(int &,int &,int &, int); 

//--------//--------//--------//--------//--------//-------- 

int __fastcall IsLeapYear(int); 

int __fastcall MonthMaxDay(int, int); 

int __fastcall MonthTtlDay(int, int); 

int * __fastcall MonthMaxDayTable(int); 

int * __fastcall MonthTtlDayTable(int); 

//------------------------------------------------------------------------ 

//字串形式的日期(不包括时间)转换为数值形式, 

//例子: "2000_01_30" -> 730148 

 

// "2000_09_45" -> -1(error) 

int __fastcall strTOdate(char * vstr) 

{

int i,y,m,d; 

// 

i = y = m = d = 0; 

// 

for(;vstr[i]!=0;i++) 

{

if(vstr[i]>='0' && vstr[i]<='9') 

y = y * 10 + (vstr[i]-'0'); 

else 

break; 

// 

while(vstr[i]!=0 &&(vstr[i]<'0' || vstr[i]>'9')) i++; 

// 

for(;vstr[i]!=0;i++) 

{

if(vstr[i]>='0' && vstr[i]<='9') 

m = m * 10 + (vstr[i]-'0'); 

else 

break;

// 

while(vstr[i]!=0 &&(vstr[i]<'0' || vstr[i]>'9')) i++; 

// 

for(;vstr[i]!=0;i++)

{

if(vstr[i]>='0' && vstr[i]<='9') 

d = d * 10 + (vstr[i]-'0'); 

else

break; 

// 

return(ymdTOdate(y,m,d)); 

}

//年/月/日的数值转换为数值日期 

//例子: 0001_01_01 -> 0 

// 2300_90_08 -> -1 

//此函数经过 0001_01_01 -- 32767_12_31 的测试. 

 

int __fastcall ymdTOdate(int vy, int vm, int vd) 

{

if(vy<1 || vy>32767 || vm<1 || vm>12 || vd<1 || vd>MonthMaxDay(vy,vm)) 

return(-1); 

// 

vd += MonthTtlDay(vy,vm)-1; 

vy --; 

return((vy*365 + vy/4 - vy/100 + vy/400)+vd); 

}

 

//数值日期转换为年/月/日的数值 

//数值日期就是从0001_01_01开始计算的天数,启始数值为 0 

//此函数经过 0001_01_01 -- 32767_12_31 的测试. 

 

int __fastcall dateTOymd(int& ry, int& rm, int& rd, int vd) 

{

if(vd<0) 

{

ry = 0; 

rm = 0; 

rd = 0; 

return(0); 

//--------//-------- 

ry = vd / 365.2425; 

vd -= ry*365 + ry/4 - ry/100 + ry/400; 

// 

if(IsLeapYear(++ry)) 

rm = 366; 

else 

rm = 365; 

// 

if(vd>=rm) 

{

vd -= rm; 

ry ++; 

//--------//-------- 

rm = vd / 30.436875 + 1 ; 

vd -= MonthTtlDay(ry,rm); 

if(++vd<=0) 

{

vd += MonthMaxDay(ry,rm); 

rm --;

else if(vd>MonthMaxDay(ry,rm)) 

{

vd -= MonthMaxDay(ry,rm); 

rm ++; 

//--------//-------- 

rd = vd; 

// 

return(1); 

}

 

int __fastcall strTOtime(char *vstr) 

{

int i,h,m,s; 

// 

i = h = m = s = 0; 

// 

for(;vstr[i]!=0;i++) 

{

if(vstr[i]>='0' && vstr[i]<='9') 

h = h * 10 + (vstr[i]-'0'); 

else 

break; 

// 

while(vstr[i]!=0 &&(vstr[i]<'0' || vstr[i]>'9')) i ++; 

// 

for(;vstr[i]!=0;i++) 

{

if(vstr[i]>='0' && vstr[i]<='9') 

m = m * 10 + (vstr[i]-'0'); 

else

break;

}

// 

while(vstr[i]!=0 &&(vstr[i]<'0' || vstr[i]>'9')) i ++; 

// 

for(;vstr[i]!=0;i++) 

{

if(vstr[i]>='0' && vstr[i]<='9') 

s = s * 10 + (vstr[i]-'0'); 

else

break;

}

// 

return(hmsTOtime(h,m,s)); 

}

 

// 

int __fastcall hmsTOtime(int vh, int vm, int vs) 

{

if((vh=(((vh*60 + vm)*60+vs)*1000)%86400000)<0) 

vh += 86400000; 

return(vh); 

}

 

// 

int __fastcall timeTOhms(int& rh, int& rm, int& rs, int vt) 

{

if((vt%=86400000)<0) 

vt +=86400000; 

// 

rh = vt / 3600000 ; 

rm = (vt % 3600000)/60000; 

rs = (vt % 60000 )/1000 ; 

// 

return(vt%1000); 

}

 

//--------//--------//--------//--------//--------//-------- 

//判断闰年啦

int __fastcall IsLeapYear(int vy) 

{

return(((vy%4)==0) && (((vy%100)!=0)||((vy%400)==0))); 

}

 

int __fastcall MonthMaxDay(int vy, int vm) 

{

return(MonthMaxDayTable(vy)[vm-1]); 

}

 

int __fastcall MonthTtlDay(int vy, int vm) 

{

return(MonthTtlDayTable(vy)[vm-1]); 

}

 

// 

int* __fastcall MonthMaxDayTable(int vy) 

{

static int mmd0[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 

static int mmd1[12]={31,29,31,30,31,30,31,31,30,31,30,31}; 

// 

if(IsLeapYear(vy)) 

return(mmd1); 

else

return(mmd0); 

}

 

int* __fastcall MonthTtlDayTable(int vy) 

{

static int mtd0[13]={0,31,59,90,120,151,181,212,243,273,304,334,365}; 

static int mtd1[13]={0,31,60,91,121,152,182,213,244,274,305,335,366}; 

// 

if(IsLeapYear(vy)) 

return(mtd1); 

else 

return(mtd0); 

#endif

 

原创粉丝点击