现在的位置: 首页 > 综合 > 正文

日历引擎

2019年03月29日 ⁄ 综合 ⁄ 共 4649字 ⁄ 字号 评论关闭
//欲知日期星期几 = 参考日期 星期几 + (相隔天数 % 7)
//
//判断日期是否有效
//
//比较两个日期大小
//
//算出相隔天数
//
//算出星期几

#include 
<stdio.h>

//判断是否是有效的日期
int AssertAvailabilityDate(long lYear,long lMon,long lDay)
{
if0>=lMon || 12<lMon )
   
return 0;
if0>=lDay || 31<lDay )
   
return 0;
if(2==lMon)
{
   
//年份能直接被4整除但不能被100整除的或者能直接被400整除的就是闰年,反之为平年.
   int iIsLeapYear=0;
   
if( (lYear%4==0 && lYear%100!=0|| (lYear%400==0) )
   
{
   iIsLeapYear
=1;
   }

   
if(iIsLeapYear)
   
{
   
if(29<lDay)
   
{
     
return 0;
   }

   }

   
else
   
{
   
if(28<lDay)
   
{
     
return 0;
   }

   }

}

else
{
   
if4==lMon || 6==lMon || 9==lMon || 11==lMon )
   
{
   
if(30<lDay)
   
{
     
return 0;
   }

   }

}

return 1;
}

//比较两个日期大小
//1>2 返回 1
//1==2 返回 0
//1<2 返回 -1
int CompareTwoDate(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
{
if(lYear1>lYear2)
{
   
return 1;
}

else if(lYear1==lYear2)
{
   
if(lMon1>lMon2)
   
{
   
return 1;
   }

   
else if(lMon1==lMon2)
   
{
   
if(lDay1>lDay2)
   
{
     
return 1;
   }

   
else if(lDay1==lDay2)
   
{
     
return 0;
   }

   
else
   
{
     
return -1;
   }

   }

   
else
   
{
   
return -1;
   }

}

else //if(lYear1<lYear2)
{
   
return -1;
}

}

//算出相隔多少天
long GetDiscrepancyDays(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
{
//2006-12-31  
long lDiscrepancy = 0 ;
if(0<CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
{
   
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
   
{
   lDiscrepancy
++;
   lDay2
++;
   
if(lMon2==1 ||lMon2==3 ||lMon2==5 ||lMon2==7 ||lMon2==8 ||lMon2==10 ||lMon2==12)
   

     
if(lDay2>31)
     
{
     lDay2
=1;
     lMon2
++;

     
if(lMon2>12)
     
{
       lMon2
=1;
       lYear2
++;
     }

     }

   }

   
else if(lMon2==2)
   
{
     
if((lYear2%4==0 && lYear2%100!=0||(lYear2%400==0))
     
{
     
if(lDay2>29)
     
{
       lDay2
=1;
       lMon2
++;
  
       
if(lMon2>12)
       
{
       lMon2
=1;
       lYear2
++;
       }

     }

     }

     
else
     
{
     
if(lDay2>28)
     
{
       lDay2
=1;
       lMon2
++;
  
       
if(lMon2>12)
       
{
       lMon2
=1;
       lYear2
++;
       }

     }

     
     }

   }

   
else
   
{
     
if(lDay2>30)
     
{
     lDay2
=1;
     lMon2
++;

     
if(lMon2>12)
     
{
       lMon2
=1;
       lYear2
++;
     }

     }

   }

   }

}

else if(0>CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
{
   
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
   
{
   lDiscrepancy
++;
   lDay1
++;
   
if(lMon1==1 ||lMon1==3 ||lMon1==5 ||lMon1==7 ||lMon1==8 ||lMon1==10 ||lMon1==12)
   

     
if(lDay1>31)
     
{
     lDay1
=1;
     lMon1
++;

     
if(lMon1>12)
     
{
       lMon1
=1;
       lYear1
++;
     }

     }

   }

   
else if(lMon1==2)
   
{
     
if((lYear1%4==0 && lYear1%100!=0||(lYear1%400==0))
     
{
     
if(lDay1>29)
     
{
       lDay1
=1;
       lMon1
++;
  
       
if(lMon1>12)
       
{
       lMon1
=1;
       lYear1
++;
       }

     }

     }

     
else
     
{
     
if(lDay1>28)
     
{
       lDay1
=1;
       lMon1
++;
  
       
if(lMon1>12)
       
{
       lMon1
=1;
       lYear1
++;
       }

     }

     
     }

   }

   
else
   
{
     
if(lDay1>30)
     
{
     lDay1
=1;
     lMon1
++;

     
if(lMon1>12)
     
{
       lMon1
=1;
       lYear1
++;
     }

     }

   }

   }

}

else
{
   lDiscrepancy 
= 0 ;
}

return lDiscrepancy ;
}


//导出函数 
//算出星期几
//参考日期
//2007.1.1 => 1
//2007.1.7 => 7
int GetWeek(long lYear,long lMon,long lDay)
{
if(!AssertAvailabilityDate(lYear,lMon,lDay))
{
   
//输入的日期无效 返回 -1
   return -1;
}

long lDiscrepancy = 0 ;
if(0==CompareTwoDate(2007,1,1,lYear,lMon,lDay))
{
   
return 1;
}

else if(0<CompareTwoDate(2007,1,1,lYear,lMon,lDay))
{
   lDiscrepancy
=GetDiscrepancyDays(2007,1,7,lYear,lMon,lDay);
   
return 7-(lDiscrepancy%7);
}

else
{
   lDiscrepancy
=GetDiscrepancyDays(2007,1,1,lYear,lMon,lDay);
   
return 1+(lDiscrepancy%7);
}

}


//给我一个日期,我告诉你它的坐标. 7*6
//2007-1
//   一 二 三 四 五 六 日
//1 1   2   3   4   5   6   7
//2 8   9   10 11 12 13 14
//3 15 16 17 18 19 20 21
//4 22 23 24 25 26 27 28
//5 29 30 31
//6
//判断是否是有效的日期
//算出 lYear年1月1日 是星期几
//算出 lYear年1月1日 的坐标
//导出函数 
//算出 lYear年lMon月lDay日 是星期几
//算出 lYear年lMon月lDay日 的坐标
int GetCoordinate(long lYear,long lMon,long lDay,int *pReturnX,int *pReturnY)
{
*pReturnX=0;
*pReturnY=0;
if(!AssertAvailabilityDate(lYear,lMon,lDay))
{
   
return 0;
}

int iFristWeek=GetWeek(lYear,lMon,1);
if(1==lDay)
{
   
*pReturnX=iFristWeek;
   
*pReturnY=1;
   
return 1;
}

int iCurWeek=GetWeek(lYear,lMon,lDay);
*pReturnX=iCurWeek;
long lDiscrepancy=GetDiscrepancyDays(lYear,lMon,lDay,lYear,lMon,1);
*pReturnY=1;

while(lDiscrepancy--)
{
   iFristWeek
++;
   
if(iFristWeek>7)
   
{
   iFristWeek
=1;
   (
*pReturnY)++;
   }

}

return 1;
}


int main()
{
int a,b,c,w,x,y;
scanf(
"%d%d%d",&a,&b,&c);
w
=GetWeek(a,b,c);
GetCoordinate(a,b,c,
&x,&y);
printf(
" %d-%d-%d => %d ",a,b,c,w);
printf(
" %d-%d-%d => (%d,%d) ",a,b,c,x,y);
return 0;
}

 

抱歉!评论已关闭.