《C》日历转换为阿富汗日历

#if 1
#include "math.h"
BOOL edl_miladi_is_leap(int miladiYear)  
{  
      if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))  
      return TRUE;  
      else  
      return FALSE;  

BOOL edl_IsPersianYearLeap(int year)
{
     return ((((((year - ((year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816)< 682; 
}
tStruct_fise_Date Edl_PersiaToChina(int year,int month,int day)  

       tStruct_fise_Date  miladiDate;
int           marchDayDiff, remainDay;
int           dayCount, miladiYear, i; 
 
// this buffer has day count of Miladi month from April to January for a none year.
int miladiMonth[12]  =  {30,31,30,31,31,30,31,30,31,31,28,31}; 
miladiYear = year + 621;
//Detemining the Farvardin the First
if(edl_IsPersianYearLeap(year)) 
{
//this is a Miladi leap year so Shamsi is leap too so the 1st of Farvardin is March 20 (3/20) 
marchDayDiff = 12;
}
else 

//this is not a Miladi leap year so Shamsi is not leap too so the 1st of Farvardin is March 21 (3/21) 
marchDayDiff = 11;

// If next year is leap we will add one day to Feb.
if(edl_miladi_is_leap(miladiYear+1))
{
miladiMonth[10] = miladiMonth[10] + 1; //Adding one day to Feb
}
//Calculate the day count for input shamsi date from 1st Farvadin
if((month>=1)&&( month<=6))
dayCount = ((month-1) * 31) + day;
       else
dayCount =(6 * 31) + ((month - 7) * 30) + day; 
//Finding the correspond miladi month and day
if (dayCount <= marchDayDiff) //So we are in 20(for leap year) or 21for none leap year) to 31 march
{
miladiDate.day= dayCount + (31 - marchDayDiff);
miladiDate.month= 3;
miladiDate.year=miladiYear;
}
else 
{
remainDay = dayCount - marchDayDiff; 


i = 0; //starting from April
while ((remainDay > miladiMonth[i]))

remainDay = remainDay - miladiMonth[i];
i++;

miladiDate.day = remainDay;
if (i > 8) // We are in the next Miladi Year

miladiDate.month= i - 8; 
miladiDate.year=  miladiYear + 1;
}
else
{
miladiDate.month= i + 4;
miladiDate.year=  miladiYear;
}
}
return miladiDate;
}
int edl_get_dayofmonth(int year,int month)
{
   int  IranSolarMonth[12]= {31,31,31,31,31,31,30,30,30,30,30,29};
   return ((edl_IsPersianYearLeap(year)&&month==12)?30:IranSolarMonth[month-1]);
}
#if 0
tStruct_fise_Date Edl_ChinaToPersia(int year,int month,int day)  
{}
#else
float edl_gregorian_to_jd(int year,int month,int day)
{
  float edl_arithmetic=1721425.5-1;
  int edl_arithmetic1=365 * (year - 1);
  int edl_arithmetic2=floor((year - 1) / 4);
  int edl_arithmetic3=(-floor((year - 1) / 100));
  int edl_arithmetic4=floor((year - 1) / 400);
  int edl_arithmetic5=floor((((367 * month) - 362) / 12));
  int edl_arithmetic6=((month <= 2) ? 0 : (edl_miladi_is_leap(year) ? -1 : -2));
  return (edl_arithmetic+
               edl_arithmetic1+
               edl_arithmetic2+
               edl_arithmetic3+
               edl_arithmetic4+
               edl_arithmetic5+
               edl_arithmetic6+
               day);
}
float edl_persian_to_jd(int year,int month,int day)
{
    int epbase, epyear;
    float edl_arithmetic=1948320.5-1;
    int edl_arithmetic1=((month <= 7) ?((month - 1) * 31) :(((month - 1) * 30) + 6));
    int edl_arithmetic2,edl_arithmetic3,edl_arithmetic4;
    epbase = year - ((year >= 0) ? 474 : 473);
    epyear = 474 +epbase%2820;


    edl_arithmetic2=floor(((epyear * 682) - 110) / 2816);
    edl_arithmetic3=(epyear - 1) * 365;
    edl_arithmetic4=(floor(epbase / 2820) * 1029983);
    return (day +
             edl_arithmetic1+
            edl_arithmetic2 +
            edl_arithmetic3 +
            edl_arithmetic4 +
            edl_arithmetic);
}
tStruct_fise_Date Edl_ChinaToPersia(int year,int month,int day)  
{
   float j;
   int depoch, cycle, cyear, ycycle,aux1, aux2,yday;
   tStruct_fise_Date  shamsidate;
   int  shamsiDay=0, shamsiYear=0;
   int shamsiMonth;
   int  dayCount=0,farvardinDayDiff=0,deyDayDiff =0;
   double ymonth;
   j=edl_gregorian_to_jd(year,month,day);
   j=floor(j)+0.5;
   depoch = j - edl_persian_to_jd(475, 1, 1);
   cycle = floor(depoch / 1029983);
    cyear =depoch%1029983;
    if (cyear == 1029982) {
        ycycle = 2820;
    } else {
        aux1 = floor(cyear/366);
        aux2 = cyear%366;
        ycycle = floor(((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) +
                    aux1 + 1;
    }
    year = ycycle + (2820 * cycle) + 474;
    if (year <= 0) {
        year--;
    }
    shamsiYear= year;
    yday = (j- edl_persian_to_jd(shamsiYear, 1, 1)) + 1;
    /*if(yday <= 186){
ymonth=yday/31.0;
shamsiMonth=ceil(ymonth);
    }
    else{
ymonth=(yday - 6)/30.0;
shamsiMonth=ceil(ymonth);
    }*/
    shamsiMonth = (yday <= 186) ?(ceil(yday / 31.0)):(ceil((yday - 6) / 30.0));
    shamsiDay = (j- edl_persian_to_jd(shamsiYear, shamsiMonth, 1)) + 1;
    shamsidate.year=shamsiYear;
    shamsidate.month=shamsiMonth;
    shamsidate.day=shamsiDay;
    return shamsidate; 
}
#endif
#endif

猜你喜欢

转载自blog.csdn.net/qq_34736952/article/details/80598249