تبلیغات
پرشین سرخ - برنامه ای برای تبدیل تاریخ میلادی و شمسی به هم
پرشین سرخ
از همه جا از همه رنگ

آرشیو موضوعی

آرشیو

لینکستان

← آمار وبلاگ

  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :

برنامه ای برای تبدیل تاریخ میلادی و شمسی به هم

اگه احتمالا تاحالا سعی کرده باشید که یه برنامه دیتابیس بنویسید به مشکل تاریخ شمسی بر خوردید!!!
دیتابیسها از تاریخ میلادی پشتیبانی میکنن و از تاریخ شمسی ما بدشون میاد !!!
توابع تبدیلی رو نت میشه پیدا کرد که متاسفانه شدیدا تو سالهای کبیسه باگ و قاط داره.
تقریبا تمام کسانی که از روشهایی مبتنی بر یکسری آرایه برای محاسبه استفاده کردند دچار مشکل هستن و اصلا قابل اعتماد نیستن. اما روشی که من میخوام معرفی کنم کاملا علمی و بر پایه محاسبات علم نجوم و تقویم شناسی پیاده سازی شده.
اما یه نکته که هست اینه که چون من کارهای دیتابیس رو با Delphi انجام میدم اینو بصورت ۲ تا تابع دلفی نوشتم و چون نیازی به استفاده تو ویژوال سی نداشتم به سی تاحالا ننوشتم و اگه فرصت شد و خواستید مینویسم و تو وب لاگ میگذارم.
۲ تا تابع یکی برای تبدیل میلادی به شمسی و دیگری برای تبدیل شمسی به میلادی هستش و خروجی اینها رو من یه رشته در نظر گرفتم ::

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;
-------------------------------------------------------------------------------
//////////////////////////Shamsi2Miadi
function Shamsi2Miladi(iyear,imonth,iday:integer):string;
var
aa:string;
epbase,epyear,mdays,jdn,l,n,i,j,k:integer;
Const PERSIAN_EPOCH = 1948321;
begin
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;
jdn:=iDay+mdays+Trunc(((epyear*682)-110) div 2816)+(epyear-1)*365+trunc(epbase div 2820)*1029983+(PERSIAN_EPOCH-1);
If (jdn > 2299160) Then
begin
l := jdn + 68569;
n := ((4 * l) div 146097);
l := l - ((146097 * n + 3) div 4);
i := ((4000 * (l + 1)) div 1461001);
l := l - ((1461 * i) div 4) + 31 ;
j := ((80 * l) div 2447);
iDay := l - ((2447 * j) div 80);
l := (j div 11) ;
iMonth := j + 2 - 12 * l ;
iYear := 100 * (n - 49) + i + l;
end
Else
begin
j := jdn + 1402;
k := ((j - 1) div 1461);
l := j - 1461 * k ;
n := ((l - 1) div 365) - (l div 1461) ;
i := l - 365 * n + 30 ;
j := ((80 * i) div 2447) ;
iDay := i - ((2447 * j) div 80) ;
i := (j div 11) ;
iMonth := j + 2 - 12 * i ;
iYear := 4 * k + n + i - 4716 ;
end;
aa:=inttostr(iYear)+'/'+inttostr(iMonth)+'/'+inttostr(iDay);
Shamsi2Miladi:=aa;
end;
امیدوارم مفید باشه براتون (که حتما خواهد بود)
موفق باشید

درباره وبلاگ

مدیر وبلاگ : سعید

آخرین پست ها

جستجو

نظرسنجی

  • مطالب وبلاگ را چگونه ارزیابی می کنید ؟







نویسندگان