#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
#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