ورود

View Full Version : نظر/پیشنهاد/انتقاد و باگ تبدیل به تاریخ قمری



Saeed_m_Farid
شنبه 14 شهریور 1388, 15:17 عصر
با سلام
دوستان و اساتید محترم برنامه نویس:
موضوع این تاپیک تبدیل تاریخ میلادی به هجری قمری(در اولویت)/شمسی هست.
بنده به علت نیاز مبرم و مشکلات متعدد در استفاده از dll ها و جستجوهای ناموفق بسیار! در نهایت مجبور شدم برای اینکه یه روال مناسب و قابل سفارشی کردن برای خودم داشته باشم، دو سه تا تابع برای تبدیل تاریخ جاری سیستم (میلادی) به تاریخ هجری شمسی/قمری بنویسم که تا جایی که میتونستم امتحانشون کردم.

با اینکه کلاس بسیار مفید آقا سالار بنام UFarsiDate در این زمینه رو دیده و استفاده کرده ام و بسیار هم مدیون ایشون (علیرغم دیدگاه های تنگ نظرانه برخی دوستان (http://barnamenevis.org/forum/showpost.php?p=790282&postcount=4)) هستم ولی در این مورد، به یک تابع کوچک و فارغ از پیچیدگی برای قابل حمل بودن نیاز هست؛ از طرف دیگه تبدیل تاریخ میلادی به قمری مدنظر هست.
بنابراین دوستان در مورد پیشنهادات/اشکالات تون لطفاً موارد زیر رو در نظر داشته باشید :


اصلاً قصد ایجاد یه dll یا کلاس جامع تبدیل انواع تاریخ ها به هم و ... برای کاربردهای اضافی ندارم، فقط یه تابع خیلی ساده برای تبدیل تاریخ میلادی به تاریخ هجری قمری مدنظر اصلی ام هست.
بیشتر خواهش دارم سعی کنید باگ های (حتماً که داره، چون عجله ای نوشتم) این تابع رو در بیارید تا کاربران برنامه هایی که از این توابع توشون استفاده شده، دچار سردرگمی نشن ...
به علت ماهیت متغیر ماههای قمری، مجبور به اتخاذ الگوریتمی شدم که به کاربر سیستم وابسته است! یعنی باید کاربر مشخص کنه که ماهها کدومشون 29 روزه هستند و کدومشون 30 روزه، با ورودی QMONTH این مورد مشخص میشه؛ ضمناً به یه وردوی دیگه هم نیاز دارم که مشخص کنه سال پیش چند روزه بوده! چون کبیسه بودن سال قمری مثل فرمتهای دیگه تقویم مشخص نیست (البته تا اونجایی که من میدونم)، بنابراین یه پارامتر GregorianStart برای شروع سال قمری مشخص کردم؛ برای سال جاری قمری این مقادیر عبارتند از :
QMONTH = '101000100110'; // 1430 Islamic months ...
GRG_START = '2008/12/29'; // 1430/01/01
اگه راه دیگه ای (نه پیچیده و عدم نیاز به اضافه کردن سربار به برنامه) به نظرتون می رسه بیزحمت بفرمایید ...
ممنون میشم اگه از این تابع استفاده کردین، مشکلاتشو به من هم گوشزد کنید :

این اصلی ترین تابع تبدیل میلادی به قمری (با خروجی String) هست :

(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)

{
This Function get Lunar (Qamary) date of "inDate"
where
1) QMONTH : means Lunar month length (0 = 29 , 1 = 30)
2) GregorianStart : is the Lunar year Start day in Gregorian date
for example 1430/01/01 equal 2008/12/28 in gregorian date ...

Sample : Caption := GetLunarDate('100110100010', '2008/12/28');
}

function GetLunarDateStr(inDate: TDateTime;
QMONTH,
GregorianStart: String): String;
var
idx, QD, QM, QY: Integer;
DQM: array [1..12] of Byte;
begin
Result := EmptyStr;

if (QMONTH = EmptyStr)
or (GregorianStart = EmptyStr) then begin
Result := 'Invalid params';
Exit;
end;

if inDate = 0 then inDate := Now;
for idx := 1 to 12 do
DQM[idx] := 29 + StrToInt(QMONTH[idx]);

idx:= 0;
QD := DaysBetween(inDate, StrToDate(GregorianStart));
QM := 0;
QY := (33 * (YearOf(inDate) - 622)) div 32;
while(QD>DQM[idx]) do begin
Dec(QD, DQM[idx]);
if(QM<100000000) then
Inc(QM) //limitation
else begin
Result := 'limitation!';
Exit;
end;
if (idx < 12) then
Inc(idx)
else begin
QM := 0;
idx := 0;
Inc(QY);
end;
end;
Result := Format('%.4d/%.2d/%.2d', [QY, QM, QD]);
end;

(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)


منتظر نظرات دوستان هستم.

Saeed_m_Farid
یک شنبه 15 شهریور 1388, 12:22 عصر
دوستان بیزحمت لطف کنید تا ماه رمضان تموم نشده؛ اگه توابع رو امتحان کردید، نتیجه رو اطلاع بدین.
نمیتونم یه سال صبر کنم تا سال بعد دوباره این بحث مطرح بشه چون تا اون موقع کسی با تاریخ قمری کاری نداره !

Saeed_m_Farid
یک شنبه 22 شهریور 1388, 13:29 عصر
به به! به به!
مشعوف و متحیر گشتیم از این همه اظهار نظر و لطف دوستان ...
از این 11 تا عزیز و استادی که کد بنده رو قابل دانلود دونستن (تا الان)، هیچ کدوم نظری ندارین؟ مشکل، باگ، بهینه سازی، ایده، ناسزا ...

MHajiSoft
یک شنبه 22 شهریور 1388, 14:16 عصر
سلام دوست عزیز
من همین الان فایلتو دانلود کردم، و هنوز ندیدمش. :بامزه:
ولی یه پیشنهاد عالی برات دارم.
به سایت زیر برو و پکیج کامپوننت XCalendar رو دانلود و استفاده کن.
تقویم میلادی، هجری شمسی (در دوحالت)، و هجری قمری (در دوحالت) اسامی توابع به صورت یکسان است.
لازمه بگم که این پروژه Open source است.
اگه ببینی نمیتونی ازش بگذری. :متفکر: خیلی عالیه. محاسبات خوب و دقیقی داره.

http://xcalendar.sourceforge‎.Net