View Full Version : مشکل در تبدیل تاریخ با استفاده از EncodeDate و یا DecodeDate
Ali_Hashemi
یک شنبه 10 خرداد 1383, 07:38 صبح
با سلام به همه دوستان
من به یک مشکل برخورد کردا ام که خیلی حالمو گرفته،
نیاز به یه راه حل سریع دارم و امیدوام کمکم کنید.
من در یک برنامه بانک اطلاعاتی از تاریخ فارسی استفاده
می کنم و تبدیل تاریخ به خوبی انجام می شود ولی زمانی که
از تابع EncodeDate ویا DecodeDate ویاحتی
( ' Dt:=Strtodate( ' 1381/4/31 استفاده می کنم دلفی یک Error
مبنی بر غیر معتبر بودن تاریخ تولید می کند.
زیرا ماه چهارم میلادی 31 روز ندارد
البته تاریخ سیستم به صورت YYYY/MM/DD و در WinMe است و
تارخ سیستم هم به درستی 1381/4/31 را نمایش میدهد.
با توجه به اینکه تمام گزارشات و محاسبات باید بر اساس تاریخ
انجام شود نمی دانم که باید چه کار کنم چون اگر تاریخ را به صورت
String در بانک ذخیره کنم دیگر نمیتوانم بین آنها مقایسه ویا محاسبه ای
انجام دهم.
لطفا مرا راهنمایی کنید. :o
متشکرم.
دوست عزیز: عنوان سوال میبایست بیانگر محتوی سوال و گویا باشد. ایندفعه رو من براتون اصلاح کردم، اما دفع بعد ممکنه پست تون حذف بشه.
مدیر سایت.
DataMaster
یک شنبه 10 خرداد 1383, 07:43 صبح
بهت توصیه میکنم برای دریافت تاریخ از کامپوننت FALAD استفاده کنی و بعدا اون رو به هر مدلی که می خوای ذخیره کن
در ضمن اگه تاریخ رو به صورت عددی ذخیره کنی فکر نکنم مشکلی داشته باشی چون اکثر عملیات مورد نظر رو می تونی رو اون انجام بدی من خودم این مدلی کار میکنم
kimia1
یک شنبه 10 خرداد 1383, 08:09 صبح
چون اگر تاریخ را به صورت
String در بانک ذخیره کنم دیگر نمیتوانم بین آنها مقایسه ویا محاسبه ای
انجام دهم.
اشتباه می فرمایید...دلفی میتونه تاریخ های 10/02/1383 را با 11/02/1383 مقایسه کنه.... و هر دو هم از نوع string باشند...من دارم مدتهاست که از این روش استفاده میکنم و جواب میگیرم.
Ali_Hashemi
یک شنبه 10 خرداد 1383, 09:11 صبح
أخه مشکل اصلی من اینه که نمیتونم
Encodedate ,Decodedate
رو بکار ببرم :?
Ali_Hashemi
یک شنبه 10 خرداد 1383, 09:13 صبح
راستی آقای DataMaster این Balad چیه و کجاست ؟
omidsm
یک شنبه 10 خرداد 1383, 10:58 صبح
خوب می تونی سورس اونها رو پیدا کنی
و برای خودت یه Encodedate ,Decodedate دیگه بنویسی :lol:
kimia1
یک شنبه 10 خرداد 1383, 11:41 صبح
أخه مشکل اصلی من اینه که نمیتونم
Encodedate ,Decodedate
رو بکار ببرم
خوب معلومه که نمیتونی اخه رنج(بازه) تاریخ ماههای اونها با ما فرق می کنه مثلا همونجوری که میدونی نمیتونی برای ماه اردیبهشت عدد 31 را وارد کنی..این توابع تا زمانی که توی اون رنج (میلادی) باشن براحتی تاریخها را decode و encode می کنند. پس از این ها نمیتونی برای تاریخهای شمسی استفاده کنی راه حلش هم اینه که
خوب می تونی سورس اونها رو پیدا کنی
و برای خودت یه Encodedate ,Decodedate دیگه بنویسی
_________________
البته اگه این کار را بکنی که معرکه است :wink:
kimia1
یک شنبه 10 خرداد 1383, 11:45 صبح
راستی آقای DataMaster این Balad چیه و کجاست ؟
در ضمن Falad هست و نه Balad ..فکر کنم توابع تاریخ آقای ربیعی هم ساده است و هم کارا فکر کنم اسمش Hredate باشه...یه جستجو توی تاپیک های قبلی بکنی حتما پیدا می کنی :wink:
Mohammad S
یک شنبه 10 خرداد 1383, 12:27 عصر
از کامپوننتهای جناب آقای رحیمی فراهانی می توانید استفاده کنید که برای کد کردن و از کد خارج کردن هم تابع دارند. قیمت آن هم چندان زیاد نیست فکر می کنم ارزشش را داشته باشد.
www.farsicomponents.com
موفق باشید.
kimia1
یک شنبه 10 خرداد 1383, 12:44 عصر
از کامپوننتهای جناب آقای رحیمی فراهانی می توانید استفاده کنید که برای کد کردن و از کد خارج کردن هم تابع دارند. قیمت آن هم چندان زیاد نیست فکر می کنم ارزشش را داشته باشد.
www.farsicomponents.com
موفق باشید.
به این میگن یه تبلیغ رایگان برای یه سایت پول در آر... :P
فکر کنم توابع آقای خجسته هم یه همچین کارهایی میکنن..تاریخها را بصورت میلادی توی بانک ذخیره میکنه..جالبه...در ضمن اجازه وارد کردن تاریخ غیر مجاز را هم نمیده...مجانی هم هست :wink:
Mohammad S
یک شنبه 10 خرداد 1383, 14:02 عصر
فکر کنم توابع آقای خجسته هم یه همچین کارهایی میکنن..تاریخها را بصورت میلادی توی بانک ذخیره میکنه..جالبه...در ضمن اجازه وارد کردن تاریخ غیر مجاز را هم نمیده...مجانی هم هست
چرا آدرس نمی دهید همه استفاده کنند؟ :?:
SalarSoft
یک شنبه 10 خرداد 1383, 19:06 عصر
به نظر این unit که آدرسش تو زیر اومده خیلی خوب کار می کنه.
من خودم امتحانش کردم. شما هم امتحانش کنین.
در ضمن می تونه هم با TDatetime کار کنه هم با string.
http://www.geocities.com/salarsoftxp/downloads/free/farsidate.zip
یا برای دیدن توضیح کامپوننت به آدرس زیر برین:
http://www.geocities.com/salarsoftxp/downlist/comp_downloads.htm
Mohammad S
یک شنبه 10 خرداد 1383, 20:25 عصر
جناب سالار
لینک شما کار نمی کنه لطفا بررسی کنید :P
ali643
یک شنبه 10 خرداد 1383, 23:44 عصر
همین کامپوننت آقای فراهانی خدا عمرش بده خیلی با حاله
من وقتی به فرمهای می رسیدم که تاریخ رو باید داخلش بود سر کد نوشتن عزا میگرفتم حالا فقط با shdate یک کلیک کافیه
تبلغ یک کلیک برای تاریخ با SHDATE
در ضمن یونیت آقای خجسته هم تو سایتشون www.delphiarea.com قرار داره
خوش باشید
kimia1
سه شنبه 12 خرداد 1383, 11:51 صبح
به نظر این unit که آدرسش تو زیر اومده خیلی خوب کار می کنه.
من خودم امتحانش کردم. شما هم امتحانش کنین.
در ضمن می تونه هم با TDatetime کار کنه هم با string.
سالار عزیز..اشتباه بزرگی کردین عزیزم..شما اومدین همون روالی را که برای استخراج تاریخ میلادی از یک عدد هست را برای تاریخ شمسی هم ادامه دادین..اشکال اینجاست که معادل تاریخ مثلا اردیبهشت ما که 31 روزه هست توی میلادی 28 روزه است..بنابراین وقتی تاریخ 29/02/1382 را بهش میدین اون را 1/3/1382 بهتون بر میگردونه و از این قبیل مشکلات...برای رفع اشکالش هم باید یکی روال Encode و Decode کردن را برای فارسی بنویسی و دیگه این که اون عدد
DateDelta = 693594;
را برای فارسی محاسبه کنی ...تا جوابت درست از آب در بیاد...
SalarSoft
چهارشنبه 13 خرداد 1383, 08:27 صبح
شما اومدین همون روالی را که برای استخراج تاریخ میلادی از یک عدد هست را برای تاریخ شمسی هم ادامه دادین
من حرف شما رو قبول دارم.
ولی باید بگم که در نحوه استفاده از این تابع ها باید ترتیب رعایت بشه تا درست کار کنن.
یعنی باید قبل از هر کاری با استفاده از تابع MiladyToShamsi تاریخ میلادی رو به تاریخ شمسی تبدیل کنید. بعد از اون می شه از تابع های FarEncodeDate و FarDecodeDate استفاده کرد.
اگر از تابع MiladyToShamsi استفاده نکنید حتما جواب غلط خواهد.
یه بار هم با توجه به گفته های من عمل کنید اگر نشد حق با شما است. :flower:
و در مورد آخری یعنیDateDelta باید بگم این ثابت در یونیت SysUtils تعریف شده و نیازی به تعریف مجدد من نبود.
kimia1
چهارشنبه 13 خرداد 1383, 12:32 عصر
ببین جناب سالار...من یه button و یک label روی فرم گذاشتم...رویداد زیر را برای دکمه نوشتم...اما تاریخ امروز که 13 خرداد است را 16 خرداد بدست می آره :متفکر: ....اگه کد ی که من نوشتم اشتباهه..لطف کنید و صحیحش را همینجا بنویسید..
ممنون میشم
procedure TForm1.Button1Click(Sender: TObject);
var f1:tdatetime;
FY,FM,FD:word;
begin
f1:=miladytoshamsi(now);
fardecodedate(f1,FY,FM,FD);
label1.Caption:=datetostr(Farencodedate(Fy,Fm,Fd)) ;
end;
amirrf
چهارشنبه 13 خرداد 1383, 18:57 عصر
از کامپوننتهای جناب آقای رحیمی فراهانی می توانید استفاده کنید که برای کد کردن و از کد خارج کردن هم تابع دارند. قیمت آن هم چندان زیاد نیست فکر می کنم ارزشش را داشته باشد.
www.farsicomponents.com
موفق باشید.
همین کامپوننت آقای فراهانی خدا عمرش بده خیلی با حاله
من وقتی به فرمهای می رسیدم که تاریخ رو باید داخلش بود سر کد نوشتن عزا میگرفتم حالا فقط با shdate یک کلیک کافیه
تبلغ یک کلیک برای تاریخ با SHDATE
متشکرم. خوشحالم که برای شما کارایی داشته و اینطور نظر دارید.
Mohammad S
چهارشنبه 13 خرداد 1383, 20:43 عصر
متشکرم. خوشحالم که برای شما کارایی داشته و اینطور نظر دارید.
می گم جناب فراهانی حالا که اینطور شد، برنامه با سورس را مجانی به ما نمی دهید؟ :mrgreen: باز هم تبلیغ می کنیم ها :twisted:
SalarSoft
شنبه 16 خرداد 1383, 08:59 صبح
ببینید آقای کیمیا... در مورد datetostr حق رو من به شما می دم. ولی...
باید بگم که... تابع datetostr با تاریخ میلادی کار می کنه و طول ماه های میلادی با ماه های شمسی فرق می کنه.
اگر کامل دقت کرده بودین می دیدین که من در تابع های Farencodedate و fardecodedate طول ماه ها رو به تاریخ شمسی تغییر دادم و از ثابت FarMonthDays استفاده کردم.
به همین دلیل شما نمی توانید از datetostr که از چیدمان تاریخ میلادی استفاده می کنه , استفاده کنید.
من قبلا به تبدیل تاریخ به صورت رشته فکر کرده بودم و می دانشتم که با datetostr مشکل ایجاد میشه.
به همین خاطر به جای تابع datetostr تابع MiladyToShamsiStr رو گذاشتم.
حتی برای جدا کردن سال , ماه و روز به صورت عدد هم تابع MiladyToShamsiInt رو گذاشتم.
توصیه می کنم از این کد استفاده کنین:
label1.Caption:=MiladyToShamsistr(now);
از حسن توجه شما متشکرم. :) :flower:
N_D
شنبه 16 خرداد 1383, 23:46 عصر
سلام
اختلاف عددی تاریخ شمسی و میلادی 7749 روز است-برای تبدیل شمسی به هجری از کد زیر استفده کنید.
function TForm1.ShamsiToHijri(y,m,d: word):TDate;
const
sumdays:array[0..11] of word=
(0,31,62,93,124,155,186,216,246,276,306,336);
begin
result:= ((y*365)+ sumdays[m-1]+ d + ((y div 4)+1));
end;
و نحوه فراخوانی آن
var
dt: TDATE;
begin
dt:= ShamsiToHijri(83,3,3)+7749;
Edit1.Text:= DateToStr(dt);
end;
Dolphin
جمعه 08 مهر 1384, 12:07 عصر
ممنون از راهنمایی تون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.