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;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
منتظر نظرات دوستان هستم.
دوستان و اساتید محترم برنامه نویس:
موضوع این تاپیک تبدیل تاریخ میلادی به هجری قمری(در اولویت)/شمسی هست.
بنده به علت نیاز مبرم و مشکلات متعدد در استفاده از 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;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
منتظر نظرات دوستان هستم.