波斯日历与公历转换算法.docx
《波斯日历与公历转换算法.docx》由会员分享,可在线阅读,更多相关《波斯日历与公历转换算法.docx(18页珍藏版)》请在冰豆网上搜索。
波斯日历与公历转换算法
#ifDISPLAY_FARSI_CALENDAR
typedefstruct{
MS_U8weekday;
MS_U8day;
MS_U8month;
MS_U16year;
}Date_time;
staticMS_BOOLMApp_IsPersianYearLeap(MS_U32year)
{
return((((((year-((year>0)?
474:
473))%2820)+474)+38)*682)%2816)<682;}
MS_U8MApp_GetIranDaysOfMonth(MS_U16u16Year,MS_U8u8Month)
{
if(u8Month>=1&&u8Month<=12){
return((MApp_IsPersianYearLeap(u16Year)&&u8Month==12)?
30IranSolarMonth[u8Month-1]);
}
else{
return0;
}
}
//ConvertMJDtoJalali
intOutDateLeap(Date_time*des)
{
MS_U8D,M;
MS_U16Y;
MS_U8r=0,m=0;
D=des->day;
M=des->month;
Y=des->year;
MS_U8R;
//R=D;//Jamieshielded
MS_U16inty;
MS_U16x12=0;//x12年
if(Y>2059){
des->year=2059;
}
if(M>12){:
des->month=12;
}
if(D>MApp_GetDaysOfThisMonth(des->year,des->month)){
des->day=MApp_GetDaysOfThisMonth(des->year,des->month);
}
R=des->day;
if(M==1||M==2)
x12=622;
elseif(M==3&&R<20)//31k
x12=622;
else
x12=621;
inty=Y-x12;//inty年1386年
MS_U16xxx=1379,i=0;//xxx年
BOOLm_ok;
do{
i++;
if(inty==xxx){
m_ok=TRUE;
break;
}
else{
m_ok=FALSE;
xxx=xxx+4;//
}
}while(i<30);//30次
if(m_ok==TRUE){
if(R<31&&M==1)
R++;
elseif(R<28&&M==2)
R++;
elseif(R<31&&M==3)
R++;
elseif(R<30&&M==4)
R++;
elseif(R<31&&M==5)
R++;
elseif(R<30&&M==6)
}R++;
elseif(R<31&&M==7)
R++;
elseif(R<31&&M==8)
R++;
elseif(R<30&&M==9)
R++;
elseif(R<31&&M==10)
R++;
elseif(R<30&&M==11)
R++;
elseif(R<31&&M==12)
R++;
else{
R=1;
M++;
}
//endifcabise
if(M==1&&R<21){
r=R+10;
m=10;
}
elseif(M==1&&R>=21){
r=R-20;
m=11;
}
elseif(M==2&&R<20){
r=R+11;
m=11;
}
elseif(M==2&&R>=20){
r=R-19;
m=12;
}
elseif(M==3&&R<21){
r=R+9;
m=12;
}
elseif(M==3&&R>=21){
r=R-20;
m=1;
}
elseif(M==4&&R<21){
r=R+11;
m=1;
}
elseif(M==4&&R>=21){
r=R-20;
m=2;
}
elseif(M==5&&R<22){
r=R+10;
m=2;
}
elseif(M==5&&R>=22){
r=R-21;
m=3;
}
elseif(M==6&&R<22){
r=R+10;
m=3;
}
elseif(M==6&&R>=22){
r=R-21;
m=4;
}
elseif(M==7&&R<23){
r=R+9;
m=4;
}
elseif(M==7&&R>=23){
r=R-22;
m=5;
}
elseif(M==8&&R<23){
r=R+9;
m=5;
}
elseif(M==8&&R>=23){
r=R-22;
m=6;
}
elseif(M==9&&R<23){
r=R+9;
m=6;
}
elseif(M==9&&R>=23){
}r=R-22;
m=7;
}
elseif(M==10&&R<23){
r=R+8;
m=7;
}
elseif(M==10&&R>=23){
r=R-22;
m=8;
}
elseif(M==11&&R<22){
r=R+9;
m=8;
}
elseif(M==11&&R>=22){
r=R-21;
m=9;
}
elseif(M==12&&R<22){
r=R+9;
m=9;
}
elseif(M==12&&R>=22){
r=R-21;
m=10;
}
intx=0;
if(M==1||M==2)
x=622;
elseif(M==3&&R<=20)//31
x=622;
else
x=621;
Y=Y-x;
des->day=r;//returnDay
des->month=m;//returnmonth
des->year=Y;//returnYear
returnTRUE;
staticintOutDateGregorian_k(Date_time*des)//<>what==>0Day1Month2Year
{
MS_U8D,M;
MS_U16Y;
//***********************
D=des->day;
M=des->month;
Y=des->year;
MS_U8m=0,r=0;
MS_U8R=0;
R=D;
if(M==1&&R<13){
m=3;
r=R+19;
}
elseif(M==1&&R>=13){
m=4;
r=R-12;
}
if(M==2&&R<12){
m=4;
r=R+19;
}
elseif(M==2&&R>=12){
m=5;
r=R-11;
}
if(M==3&&R<12){
m=5;
r=R+20;
}
elseif(M==3&&R>=12){
m=6;
r=R-11;
}
if(M==4&&R<11){
m=6;
r=R+20;
}
elseif(M==4&&R>=11){
}m=7;
r=R-10;
if(M==5&&R<11){
m=7;
r=R+21;
}
elseif(M==5&&R>=11){
m=8;
r=R-10;
}
if(M==6&&R<11){
m=8;
r=R+21;
}
elseif(M==6&&R>=11){
m=9;
r=R-10;
}
if(M==7&&R<10){
m=9;
r=R+21;
}
elseif(M==7&&R>=10){
m=10;
r=R-9;
}
if(M==8&&R<11){
m=11;
r=R+21;
}
elseif(M==8&&R>=11){
m=12;
r=R-10;
}
if(M==9&&R<11){
m=11;
r=R+20;
}
elseif(M==9&&R>=11){
m=12;
r=R-10;
}
//-----------
Y=Y+621;
if(M==10&&R<12){
m=12;
r=R+20;
//Y++;
}
elseif(M==10&&R>=12){
m=1;
r=R-11;
Y++;
}
if(M==11&&R<13){
m=1;
r=R+19;
Y++;
}
elseif(M==11&&R>=13){
m=2;
r=R-12;
Y++;
}
if(M==12&&R<11){
m=2;
r=R+18;
Y++;
}
elseif(M==12&&R>=11){
m=3;
r=R-10;
Y++;
}
des->day=r;//returnDay
des->month=m;//returnmonth
des->year=Y;//returnYear
returnTRUE;
}
intOutDateGregorian(Date_time*des)//what==>0Day1Month2Year
{
MS_U8D,M;
MS_U16Y;
//***********************
D=des->day;
M=des->month;
Y=des->year;
MS_U8m=0,r=0;
MS_U8R=0;
/*
//printf("M=%dD=%dY=%d\n",M,D,Y);
if(Y>2059){
des->year=2059;//returnYear
returnFALSE;
}
if(M>12){
des->month=12;//returnmonth
}
if(D>MApp_GetIranDaysOfMonth()){
des->day=31;//returnDay
}
*/
intinty=Y;
intxxx=1379,i=0;
BOOLm_ok;
do{
i++;
if(inty==xxx){
m_ok=TRUE;
break;
}
else{
m_ok=FALSE;
xxx=xxx+4;//----------忧?
呷碛?
逖嶅茄忧?
磉惹?
----
}
}while(i<30);
if(m_ok==TRUE){
}returnOutDateGregorian_k(des);
R=D;
if(M==1&&R<12){
m=3;
r=R+20;
}
elseif(M==1&&R>=12){
m=4;
r=R-11;
}
if(M==2&&R<11){
m=4;
r=R+20;
}
elseif(M==2&&R>=11){
m=5;
r=R-10;
}
if(M==3&&R<11){
m=5;
r=R+21;
}
elseif(M==3&&R>=11){
m=6;
r=R-10;
}
if(M==4&&R<10){
m=6;
r=R+21;
}
elseif(M==4&&R>=10){
m=7;
r=R-9;
}
if(M==5&&R<10){
m=7;
r=R+22;
}
elseif(M==5&&R>=10){
m=8;
r=R-9;
}
if(M==6&&R<10){
m=8;
r=R+22;
}
elseif(M==6&&R>=10){
m=9;
r=R-9;
}
if(M==7&&R<9){
m=9;
r=R+22;
}
elseif(M==7&&R>=9){
m=10;
r=R-8;
}
if(M==8&&R<10){
m=11;
r=R+22;
}
elseif(M==8&&R>=10){
m=12;
r=R-9;
}
if(M==9&&R<10){
m=11;
r=R+21;
}
elseif(M==9&&R>=10){
m=12;
r=R-9;
}
//-----------
Y=Y+621;
if(M==10&&R<11)
{
m=12;
r=R+21;
//Y++;
}
elseif(M==10&&R>=11)
{
m=1;
r=R-10;
Y++;
}
if(M==11&&R<12){
m=1;
r=R+20;
Y++;
}
elseif(M==11&&R>=12){
m=2;
r=R-11;
Y++;
}
if(M==12&&R<10){
m=2;
r=R+19;
Y++;
}
elseif(M==12&&R>=10){
m=3;
r=R-9;
Y++;
}
des->day=r;//returnDay
des->month=m;//returnmonth
des->year=Y;//returnYear
returnTRUE;
}
#endif