سفارش تبلیغ
صبا ویژن
مدیر وبلاگ
 
آمار واطلاعات
بازدید امروز : 0
بازدید دیروز : 0
کل بازدید : 1542
کل یادداشتها ها : 3
خبر مایه


گه احتمالا تاحالا سعی کرده باشید که یه برنامه دیتابیس بنویسید به مشکل تاریخ شمسی بر خوردید!!!

دیتابیسها از تاریخ میلادی پشتیبانی میکنن و از تاریخ شمسی ما بدشون میاد !!!

توابع تبدیلی رو نت میشه پیدا کرد مثلا یکی تو سایت 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;






طراحی پوسته توسط تیم پارسی بلاگ