PDA

View Full Version : آموزش: دو تا تابع ساده برای تبدیل تاریخ میلادی به شمسی



majidbestgame
جمعه 13 خرداد 1390, 02:18 صبح
سلام خدمت تمامی دلفی کار های عزیز... شاید تا به حال براتون پیش اومده باشه که یک برنامه فارسی زبان نوشتید و نیاز به یک تاریخ شمسی داشتید که تو برنامتون نمایش داده بشه و به مشگل بر خوردید....همین مشگل برای خودم چند وقت پیش به وجود اومد که تصمیم گرفتم خودم این مشگل رو حل کنم واشه همین دست به کار شدم و دو تا تابع نوشتم که میشه گفت مشگلم را حل کرد امروز که داشتم سورس های دلفیمو زیرورو میکردم این کد رو دیدم گفتم بزار واسه برنامه نویس های عزیز بزارمش...از اساتید اگه این توابع نقصی داشتن خوشحال میشم راهنمایی بفرمایین....
این تابع تاریخ شمسی رو به صورت عددی باز میگرداند:

Function IntShamsiDate:String;
var yy,mm,dd:word;
yi,mi,di:integer;
ys,ms,ds:string;
begin
decodedate(now,yy,mm,dd);

yi:=yy-621;
mi:=mm-3;

case mm of
1 :di:=dd+10;
2 :di:=dd+11;
3 :di:=dd+9;
4 :di:=dd+11;
5 :di:=dd+10;
6 :di:=dd+10;
7 :di:=dd+9;
8 :di:=dd+9;
9 :di:=dd+9;
10 :di:=dd+8;
11 :di:=dd+9;
12 :di:=dd+9;
end;


if mi<=0 then
begin
mi:=12+mi;
yi:=yi-1;
end;

if (mi>=1) and (mi<7) then
begin
if di>31 then
begin
di:=di-31;
mi:=mi+1;
end;
End else
if (mi>=7) and (mi<12) then
begin
if di>30 then
begin
di:=di-30;
mi:=mi+1;
end;
end else if mi=12 then
begin
if di>29 then begin
di:=di-29;
mi:=1;
yi:=yi+1;
end;
end;

if mi<10 then begin
ms:='0'+inttostr(mi);
end else
ms:=inttostr(mi);

if di<10 then begin
ds:='0'+inttostr(di);
end else
ds:=inttostr(di);

result:=inttostr(yi)+'/'+ms+'/'+ds;
End;
این تابع تاریخ رو به صورت حروف باز میگرداند:

function StrShamsiDate:String;
var yy,mm,dd:word;
yi,mi,di:integer;
ys,ms,ds:string;
begin
decodedate(now,yy,mm,dd);

yi:=yy-621;
mi:=mm-3;

case mm of
1 :di:=dd+10;
2 :di:=dd+11;
3 :di:=dd+9;
4 :di:=dd+11;
5 :di:=dd+10;
6 :di:=dd+10;
7 :di:=dd+9;
8 :di:=dd+9;
9 :di:=dd+9;
10 :di:=dd+8;
11 :di:=dd+9;
12 :di:=dd+9;
end;


if mi<=0 then
begin
mi:=12+mi;
yi:=yi-1;
end;

if (mi>=1) and (mi<7) then
begin
if di>31 then
begin
di:=di-31;
mi:=mi+1;
end;
End else
if (mi>=7) and (mi<12) then
begin
if di>30 then
begin
di:=di-30;
mi:=mi+1;
end;
end else if mi=12 then
begin
if di>29 then begin
di:=di-29;
mi:=1;
yi:=yi+1;
end;
end;

case Mi of
1 :ms:='فروردين';
2 :ms:='ارديبهشت';
3 :ms:='خرداد';
4 :ms:='تير';
5 :ms:='مرداد';
6 :ms:='شهريور';
7 :ms:='مهر';
8 :ms:='آبان';
9 :ms:='آذز';
10 :ms:='دي';
11 :ms:='بهمن';
12 :ms:='اسفند';
end;

case di of
1 :ds:='يکم';
2 :ds:='دوم';
3 :ds:='سوم';
4 :ds:='چهارم';
5 :ds:='پنجم';
6 :ds:='ششم';
7 :ds:='هفتم';
8 :ds:='هشتم';
9 :ds:='نهم';
10 :ds:='دهم';
11 :ds:='يازده ام';
12 :ds:='دوازده ام';
13 :ds:='سيزده ام';
14 :ds:='چهارده ام';
15 :ds:='پانزده ام';
16 :ds:='شانزده ام';
17 :ds:='هفده ام';
18 :ds:='هيجده ام';
19 :ds:='نوزده ام';
20 :ds:='بيستم';
21 :ds:='بيست و يکم';
22 :ds:='بيست و دوم';
23 :ds:='بيست و سوم';
24 :ds:='بيست و چهارم';
25 :ds:='بيست و پنجم';
26 :ds:='بيست وششم';
27 :ds:='بيست و هفتم';
28 :ds:='بيست و هشتم';
29 :ds:='بيست و نهم';
30 :ds:='سي ام';
31 :ds:='سي و يکم';
end;

result:=ds+' '+ms+' '+inttostr(yi);

end;

اگه خواستی تشکر کنی دگمه تشکر سمت چپ پایین این پسته:لبخند:

yazdanian
یک شنبه 25 فروردین 1392, 14:42 عصر
سپاس . نحوه نمایش چی؟؟؟؟؟؟؟ کدرو بزارید

SayeyeZohor
یک شنبه 25 فروردین 1392, 15:03 عصر
اينم نحوه نمايش

ShowMessage(IntShamsiDate);
ShowMessage(StrShamsiDate);

kamran749
چهارشنبه 11 اردیبهشت 1392, 05:16 صبح
سلام
با تشکر
اين دو تابع با سالهاي کبيسه مشکل دارد.لطفا آنرا اصلاح نماييد.من نياز به تابعي که تاریخ را به صورت حروف باز میگرداند، دارم.
ممنون

kamran749
یک شنبه 15 اردیبهشت 1392, 05:47 صبح
سلام
با تشکر
اين دو تابع با سالهاي کبيسه مشکل دارد.لطفا آنرا اصلاح نماييد.من نياز به تابعي که تاریخ را به صورت حروف باز میگرداند، دارم.
ممنون

کسي نبود جواب مرا بدهد.:گریه:

kamran749
سه شنبه 17 اردیبهشت 1392, 04:58 صبح
کسي نبود جواب مرا بدهد.:گریه:

لطفا اگر کسي بلد است جواب بدهد.

یوسف زالی
چهارشنبه 18 اردیبهشت 1392, 09:22 صبح
http://barnamenevis.org/showthread.php?397232-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%A8%D8%A7-%D8%AF%D9%82%D8%AA-5000-%D8%B3%D8%A7%D9%84-%D8%AA%D8%B3%D8%AA-%D8%B4%D8%AF%D9%87-%D8%A8%D8%A7-%D8%AA%D9%82%D9%88%DB%8C%D9%85-%D8%B1%D8%B3%D9%85%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-http-www.time.ir

mbshareat
یک شنبه 15 دی 1398, 23:38 عصر
سلام
من به یه تابع ساده نیاز دارم مثل تابع اول در این تاپیک.تست کردم خوب بود آقا یوسف یه تاپیک بلند بالا دارند که کلی خوندم نفهمیدم چه کار کنم.
فقط میخوام یه خروجی مثل خروجی IntShamsiDate داشته باشم که با سالهای کبیسه مشکل نداشته باشه.(البته همین تابع امتحان کردم تاریخ رو درست برگردوند)

ممکنه کسی تابع بالای صفحه رو تکمیل کنه؟