الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی
الگوریتم تبدیل تاریخ
میلادی به تاریخ شمسی :
تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است. برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "79" روز است. برای تشخیص کبیسه بودن یا
نبودن سال از روش زیر استفاده می کنیم: دو حالت پیش می آید:
حال باید مشخص کنیم که در
6 ماه اول سال شمسی قرار داریم یا در 6 ماه دوم سال قرار داریم،
سال شمسی از تفاضل سال میلادی با"621" بدست می آید.
اختلاف روز با
تعداد روز محاسبه شده جمع می کنیم ، آن را بر"30" تقسیم می کنیم(3 ماه آخر
سال شمسی 30 روزه است.). در این حالت سال شمسی از تفاضل سال میلادی با"622" بدست می آید.(زیرا در سال قبل قرار داریم.) |
typedef struct _SHAMSIDATE SHAMSIDATE
MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int
iMiladiYear) farvardinDayDiff=79; // the function check a miladiyear is leap
or not.
{
int iYear;
int
iMonth;
int iDay;
}SHAMSIDATE;
{
int
shamsiDay, shamsiMonth, shamsiYear;
int
dayCount,farvardinDayDiff,deyDayDiff ;
int
sumDayMiladiMonth[] = {0,31,59,90,120,151,181,212,243,273,304,334};
int sumDayMiladiMonthLeap[]=
{0,31,60,91,121,152,182,213,244,274,305,335};
SHAMSIDATE
shamsidate;
if (MiladiIsLeap(iMiladiYear))
{
dayCount =
sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay;
}
else
{
dayCount
= sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay;
}
if((MiladiIsLeap(iMiladiYear - 1)))
{
deyDayDiff = 11;
}
else
{
deyDayDiff
= 10;
}
if
(dayCount > farvardinDayDiff)
{
dayCount = dayCount -
farvardinDayDiff;
if (dayCount
<= 186)
{
switch (dayCount%31)
{
case 0:
shamsiMonth = dayCount / 31;
shamsiDay = 31;
break;
default:
shamsiMonth
= (dayCount / 31) + 1;
shamsiDay =
(dayCount%31);
break;
}
shamsiYear
= iMiladiYear - 621;
}
else
{
dayCount = dayCount - 186;
switch (dayCount%30)
{
case 0:
shamsiMonth = (dayCount / 30) + 6;
shamsiDay = 30;
break;
default:
shamsiMonth
= (dayCount / 30) + 7;
shamsiDay =
(dayCount%30);
break;
}
shamsiYear =
iMiladiYear - 621;
}
}
else
{
dayCount
= dayCount + deyDayDiff;
switch
(dayCount%30)
{
case 0 :
shamsiMonth
= (dayCount / 30) + 9;
shamsiDay = 30;
break;
default:
shamsiMonth
= (dayCount / 30) + 10;
shamsiDay = (dayCount%30);
break;
}
shamsiYear =
iMiladiYear - 622;
}
shamsidate.iYear = shamsiYear;
shamsidate.iMonth
= shamsiMonth;
shamsidate.iDay = shamsiDay;
return shamsidate ;
}
BOOL
MiladiIsLeap(int miladiYear)
{
if(((miladiYear % 100)!= 0 &&
(miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear
% 400) == 0))
return TRUE;
else
return
FALSE;
}