گه احتمالا تاحالا سعی کرده باشید که یه برنامه دیتابیس بنویسید به مشکل تاریخ شمسی بر خوردید!!!
دیتابیسها از تاریخ میلادی پشتیبانی میکنن و از تاریخ شمسی ما بدشون میاد !!!
توابع تبدیلی رو نت میشه پیدا کرد مثلا یکی تو سایت www.iranasp.net معرفی شده که شدیدا تو سالهای کبیسه باگ و قاط داره.
تقریبا تمام کسانی که از روشهایی مبتنی بر یکسری آرایه برای محاسبه استفاده کردند دچار مشکل هستن و اصلا قابل اعتماد نیستن. اما روشی که من میخوام معرفی کنم کاملا علمی و بر پایه محاسبات علم نجوم و تقویم شناسی پیاده سازی شده و اصلا مو لا درزش نمیره!!(میگی نه تستش کن)
اما یه نکته که هست اینه که چون من کارهای دیتابیس رو با Delphi انجام میدم اینو بصورت 2 تا تابع دلفی نوشتم و چون نیازی به استفاده تو ویژوال سی نداشتم به سی تاحالا ننوشتم و اگه فرصت شد و خواستید مینویسم و تو وب لاگ میگذارم.
2 تا تابع یکی برای تبدیل میلادی به شمسی و دیگری برای تبدیل شمسی به میلادی هستش و خروجی اینها رو من یه رشته در نظر گرفتم ::
function Miladi2Shamsi(iyear,imonth,iday:integer):string;
var
aa:string ;
jdn,jdn2,depoch,cycle,cyear,ycycle,aux1, aux2,yday:integer;
epbase,epyear,mdays:integer;
Const PERSIAN_EPOCH = 1948321 ;
begin
If ((iYear > 1582) Or ((iYear = 1582) And (iMonth > 10)) Or ((iYear = 1582) And (iMonth = 10) And (iDay > 14))) Then
jdn:=((1461*(iYear+4800+((iMonth-14) div 12))) div 4)+((367*(iMonth-2-12*(((iMonth-14) div 12)))) div 12)-((3*(((iYear+4900+((iMonth-14) div 12)) div 100))) div 4)+iDay-32075
Else
jdn := 367 * iYear - ((7 * (iYear + 5001 + ((iMonth - 9) div 7))) div 4) + ((275 * iMonth) div 9) + iDay + 1729777;
epbase:=475-474;
epyear:= 474 + (epbase Mod 2820) ;
mdays:= (1 - 1) * 31 ;
jdn2:=1+mdays+ Trunc(((epyear*682)-110)/ 2816)+(epyear-1)*365+Trunc(epbase / 2820)*1029983+(PERSIAN_EPOCH-1);
depoch:=jdn-jdn2;
cycle:= Trunc(depoch / 1029983);
cyear:= depoch Mod 1029983 ;
If cyear = 1029982 Then
ycycle:=2820
Else
begin
aux1:=Trunc(cyear / 366);
aux2:=cyear Mod 366;
ycycle:=round(((2134*aux1)+(2816*aux2)+2815) / 1028522)+aux1+1;
End;
iYear:=ycycle+(2820*cycle)+474;
If iYear <= 0 Then
iYear:=iYear-1;
If iYear>=0 Then
epbase:=iYear-474
Else
epbase:=iYear-473;
epyear:=474+(epbase Mod 2820);
mdays:=(1-1)*31;
jdn2:=1+mdays+Trunc(((epyear*682)-110)/ 2816)+(epyear-1)*365 +Trunc(epbase / 2820)*1029983+(PERSIAN_EPOCH-1);
yday:=(jdn-jdn2)+1;
If yday <= 186 Then
iMonth:= -Sign(yday / 31) * round(-Abs(yday / 31))
Else
iMonth:= -Sign(((yday - 6) / 30)) * round(-Abs((yday - 6) / 30));
If iYear >= 0 Then
epbase:=iYear-474
Else
epbase:=iYear-473;
epyear:=474+(epbase Mod 2820);
If iMonth <= 7 Then
mdays:=(iMonth-1)*31
Else
mdays:=(iMonth-1)*30+6;
jdn2:=1+mdays+Trunc(((epyear*682)-110)/ 2816)+(epyear-1)*365+ Trunc(epbase / 2820)*1029983+(PERSIAN_EPOCH-1);
iDay:=(jdn-jdn2)+1;
aa:=inttostr(iYear)+"/"+inttostr(iMonth)+"/"+inttostr(iDay);
Miladi2Shamsi:=aa;
end;