typedef unsigned int time_t;
typedef struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
}tm;
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void locatime(time_t time,struct tm *t)
{
unsigned int pass4year;
int hours_pre_year;
if(time<0)time=0;
t->tm_sec = (int)(time % 60);
time /=60;
t->tm_min = (int)(time % 60);
time /=60;
pass4year = (unsigned int)time/(1461L * 24L);
t->tm_year = (pass4year<<2) + 1970;
time %= 1461L * 24L;
for(;;)
{
hours_pre_year = 365*24;
if((t->tm_year & 3) == 0)
{
hours_pre_year += 24;
}
if(time<hours_pre_year)
{
break;
}
t->tm_year++;
time -= hours_pre_year;
}
t->tm_hour = (int)(time % 24);
time /= 24;
time++;
if((t->tm_year & 3) == 0)
{
if(time>60){
time--;
}
else {
if(time == 60)
{
t->tm_mon = 1;
t->tm_mday = 29;
return;
}
}
}
for(t->tm_mon;Days[t->tm_mon]<time;t->tm_mon++)
{
time -= Days[t->tm_mon];
}
t->tm_mday = (int)(time);
return;
}
static time_t mon_yday[2][12] =
{
{0,31,59,90,120,151,181,212,243,273,304,334},
{0,31,60,91,121,152,182,213,244,274,305,335}
};
int isleap(int year)
{
return (year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 ==0);
}
time_t mktime(struct tm dt)
{
time_t result;
int i = 0;
result = (dt.tm_year - 1970) * 365 * 24 * 3600 +
(mon_yday[isleap(dt.tm_year)][dt.tm_mon-1] + dt.tm_mday - 1) * 24 * 3600 +
dt.tm_hour * 3600 + dt.tm_mday * 60 + dt.tm_sec;
for(i = 1970;i<dt.tm_year;i++)
{
if(isleap(i))
{
result += 24*3600;
}
}
return (result);
}
void main()
{
time_t time;
time_t time2;
long i = 0;
static tm t;
time = 1514768461;
for(i = 0;i<(4*365+1);i++)
{
locatime(time,&t);
printf("A time:%d\r\n",time);
printf("A %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);
t.tm_mon++;
time2 = mktime(t);
/*
t.tm_mon+=1;
time2 = mktime(t);
printf("B time:%d\r\n",time2);
memset((void*)&t,0x00,sizeof(t));
localtime(time2,&t);
printf("B %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);
memset((void*)&t,0x00,sizeof(t));
time += 24*3600;*/
}
printf("over");
return;
}