با استفاده از تابع زیر می تونید تاریخ میلادی رو به تاریخ شمسی تبدیل کنید. این تابع تاریخ سیستم رو می گیره و معادل شمسی اون رو بر می گردونه . من یکسری تابع های دیگه دیدم که این کار رو انجام میدن ولی اکثرشون یه روزهایی اشتباه عمل می کردن ولی این تابع خیلی خیلی دقیقه و به هیچ عنوان اشتباه نمی کنه .
Function SHDate:String;
Const
D : Array [0..11] of integer=(20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21);
P : Array [0..11] of integer=(11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10);
Mon: Array [0..11]of String=('01','02','03','04','05','06','07','08','09','10','11','12');
Var DateLocal:_SYSTEMTIME;
Dm,Mm,Ym:Word;
P1,D1,I,U,Rp,Ys,Ms,Ds,X:Integer;
Sal,Mah,Roz:String;
begin
GetLocalTime(DateLocal);
Ym:=DateLocal.wYear;
Mm:=DateLocal.wMonth;
Dm:=DateLocal.wDay;
Dm := Dm;
U := 0;
Rp:= 0;
If (Ym Mod 4) = 0 Then U := 1;
If ((Ym Mod 100 = 0) AND (Ym Mod 400 <> 0)) Then U := 0;
Ys := Ym - 622;
X := Ys - 22;
X := X Mod 33;
If ((X Mod 4 = 0) AND (X <> 32)) Then Rp := 1;
I := Not(Rp-2) + NOT(U - 2) * 2;
X := 0;
If (I = 0) AND (Mm = 3) Then X := 1;
If I = 0 Then I := 3;
Ms := (9 + Mm) Mod 13;
If Ms < 10 Then Ms := Ms + 1;
D1 := D[Mm - 1];
If (I = 1) AND (Mm > 2) Then D1 := D1 - 1;
If (I = 2) AND (Mm < 3) then D1 := D1 - 1;
P1 := P[Mm - 1];
If (I = 1) AND (Mm > 2) Then P1 := P1 + 1;
If (I = 2) AND (Mm < 4) Then P1 := P1 + 1;
If (Dm > 0) AND (Dm <= D1) Then
Begin
Ds := P1 + Dm + X - 1;
X := 1;
End
Else
Begin
Ds := Dm - D1;
Ms := Ms + 1;
If Ms = 13 Then Ms := 1;
X := 2;
End;
If ((Mm = 3) AND (X = 2)) OR (Mm > 3) Then Ys := Ys + 1;
Sal:=IntToStr(Ys);
If Length(Sal)=1 then Insert('0',Sal,1);
Mah:=Mon[Ms-1];
Roz:=IntToStr(Ds);
If Length(Roz)=1 then Insert('0',Roz,1);
Result:=Sal+'/'+Mah+'/'+Roz;
Delete(Result,1,2);
end;
دسته بندی :





پیوندها


