En  Fa
درحال مشاهده: مقالات  > زبان های برنامه سازی  > مقالات Delphi  > تبدیل تاریخ میلادی به شمسی و برعکس برای دلفی
 
 

دسته بندی مقالات

 

 

دسته بندی سوالات

 



 

تبدیل تاریخ میلادی به شمسی و برعکس برای دلفی

   

تبدیل تاریخ میلادی به شمسی و برعکس برای دلفی

مقدمه

با استفاده از این ابزار که برای زبان دلفی نوشته شده است، می توانید تاریخ میلادی را به شمسی و شمسی را به میلادی تبدیل کنید. این کلاس همراه با توابع آماده، برای راحتی کار برنامه نویسان طراح شده است.

استفاده سریع و آسان

تبدیل تاریخ میلادی به شمسی

استفاده از این ابزار بسیار ساده و راحت است. برای استفاده از این کلاس باید یک نوع از آن را ایجاد کنید. سازنده این کلاس تعدادی ورودی را قبول می کند. این ورودی می تواند تاریخ میلادی یا شمسی در فرمت های متنی یا عدد باشد.

برای تبدیل تاریخ میلادی به شمسی با فرمت عددی فقط کافی است که ورودی ها به سازنده کلاس ارسال شود:

procedure TfrmDemo.Button1Click(Sender: TObject);
var faDate:TFaDate;
begin
faDate:=TFaDate.CreateByGregorianDate(2008,4,15);
end

در این تکه کد یک متغیر از نوع کلاس TFaDate ایجاد کردیم. و سپس با فراخوانی تابع CreateByGregorianDate نمونه جدید از این کلاس را ایجاد میکنیم که همانطور که می بینید ورودی های آن تاریخ میلادی است.
پس از اینکه نمونه جدید ایجاد شد این کلاس تاریخ را به شمسی تبدیل می کند. برای استفاده از این تاریخ تبدیل شده راه های مختلفی وجود دارد که بعدا توضیح داده خواهد شد.

می خواهیم که تاریخ تبدیل شده را به صورت متنی در عنوان فرم داشته باشیم. پس از کد می توان استفاده کرد:

procedure TfrmDemo.Button1Click(Sender: TObject);

var
faDate:TFaDate;

begin
faDate:=TFaDate.CreateByGregorianDate(2008,4,15);
self.Caption:=faDate.ToDateString;

end;

در این مثال با فراخوانی متد ToDateString از نمونه ای که ایجاد کرده ایم تاریخ شمسی را به صورت متنی در عنوان فرم خواهیم داشت. تابع ToDateString که در کلاس TFaDate تعریف شده است خروجی از تاریخ شمسی از نوع رشته دارد.

برای دریافت جزئیات بیشتر از تاریخ تبدیل شده، تعداد تابع و ویژگی در نظر گرفته شده است که می توانید از آنها استفاده کنید. تمامی آنها بعدا به طور کامل توضیح داده می شود.
در این مثال قصد داریم تا نام ماهی که در آن قرار داریم و روز هفته را در عنوان فرم نمایش دهیم:

procedure TfrmDemo.Button1Click(Sender: TObject);

var faDate:TFaDate;

begin
faDate:=TFaDate.CreateByGregorianDate(2008,4,15);
self.Caption:=faDate.MonthName+ ' ' +faDate.DayName;
end;

همانطور که می بینید ویژگی MonthName نام ماه شمسی و DayName نام روز شمسی را برمیگرداند.

تبدیل تاریخ شمسی به میلادی

همانند روش قبلی در این تبدیل نیز باید یک نمونه از کلاس را با تاریخ شمسی ایجاد کنید. برای مثال:

procedure TfrmDemo.Button1Click(Sender: TObject);

var
faDate:TFaDate;

begin
faDate:=TFaDate.CreateByPersianDate(1387,6,6);

end;

همانطور که مشخص است در این تبدیل از تابع CreateByPersianDate استفاده شده که ورودی های آن تاریخ شمسی است.

برای دریافت تاریخ میلادی در فرمت استاندارد دلفی کافی است که از تابع ToGregorianDate استفاده کنید.

در اینجا تاریخ شمسی را به میلادی تبدیل می کنیم سپس آن را با استفاده توابع استاندارد دلفی به رشته تبدیل کرده و در عنوان فرم نمایش می دهیم:

procedure TfrmDemo.Button1Click(Sender: TObject);

var
faDate:TFaDate;
enDate:TDateTime;

begin
faDate:=TFaDate.CreateByPersianDate(1387,6,6);
enDate:=fadate.ToGregorianDate();
self.Caption:=DateToStr(enDate);
end;

همانطور که مشاده کردید تاریخ شمسی به راحتی به تاریخ میلادی تبدیل شد. 

در ضمیمه این مقاله برنامه demo گنجانده شده است که حاوی مثال هایی از نحوه استفاده از این کلاس در شرایط مختلف است. برای آشنایی صحیح از تمام امکانات این ابزار حتما از این demo استفاده کنید.

توضیح امکانات این کلاس

این کلاس حاوی تعدادی متد و تعدادی ویژگی است که در ادامه خواهید خواند.

سازندگان کلاس

CreateByGregorianDate(gregorianDate: TDateTime): TFaDate;
Create(gregorianDate: TDateTime);

این دو متد که عملکرد یکسانی دارند جهت ایجاد یک نمونه از کلاس با استفاده از تاریخ میلادی ورودی مورد استفاده قرار می گیرند. اولی یعنی CreateByGregorianDate یک "تابع کلاس" است و دومی سازنده استاندارد دلفی برای کلاس است.

CreateByGregorianDate(gregorianYear, gregorianMonth, 
gregorianDay: word): TFaDate;

این تابع کلاس برای ایجاد یک نمونه از کلاس TFaDate با استفاده از تاریخ میلادی مورد استفاده است. همانطور که مشخص است تاریخ میلادی از طریق ورودی از نوع عدد ارسال می شود.

CreateByPersianDate(persianDate: string): TFaDate;
Create(persianDate: string);

این دو متد که عملکرد یکسانی دارند جهت ایجاد یک نمونه از کلاس با استفاده از تاریخ شمسی ورودی مورد استفاده قرار می گیرند. اولی یعنی CreateByPersianDate یک "تابع کلاس" است و دومی سازنده استاندارد دلفی برای کلاس است.

CreateByPersianDate(persianYear, persianMonth, persianDay: 
word): TFaDate;

این تابع کلاس برای ایجاد یک نمونه از کلاس با استفاده از تاریخ شمسی مورد استفاده است. همانطور که مشخص است تاریخ شمسی از طریق ورودی از نوع عدد ارسال می شود.

متد ها و توابع

  • تابع ToString

ToString: string;
ToString(format: string): string;

خروجی این دو تابع، تاریخ شمسی همراه با زمان در فرمت رشته است. تابع اولی بدون هیچ پارامتری است و تابع دوم فرمت رشته را نیز قبول میکند. رشته ورودی در قالب استاندارد فرمت بندی تاریخ در دلفی باید باشد. اطلاعات بیشتر در این مورد را می توانید در راهنمای دلفی با توضیح کامل پیدا کنید.
مثال:

procedure TfrmDemo.btnFormatDateTimeClick(Sender: TObject);

var
faDate:TFaDate;
begin
faDate:=TFaDate.Create(Now);
lblFormatDateTime1.Caption:=faDate.ToString;
lblFormatDateTime2.Caption:=faDate.ToString('dddd dd mmmm yyyy HH:MM');
end;
  • تایع ToDateString

ToDateString: string;

این تابع بر خلاف تابع ToString فقط تاریخ شمسی را بر می گرداند:

procedure TfrmDemo.btnFormatDateTimeClick(Sender: TObject);

var
faDate:TFaDate;
begin
faDate:=TFaDate.Create(Now);
lblFormatDateTime1.Caption:=faDate.ToDateString;
end;
  • تابع ToTimeString

ToTimeString: string;

این تابع فقط زمان را بر می گرداند.

نکته: اطلاعات زمان فقط زمانی مورد پردازش قرار خواهند گرفت در ایجاد کلاس TFaDate ورودی سازنده را از نوع TDateTime بدهید. در غیر این صورت مقدار برگشتی تابع ToTimeString مقادیر صفر خواهند بود.

در مثال زیر ورودی سازنده تابع Now است که مقداری از نوع TDateTime بر میگرداند:

procedure TfrmDemo.btnFormatDateTimeClick(Sender: TObject);
var
faDate:TFaDate;
begin
faDate:=TFaDate.Create(Now);
lblFormatDateTime1.Caption:=faDate.ToTimeString;
end;
  • تابع ToGregorianDate برای تبدیل تاریخ به میلادی

ToGregorianDate: TDateTime;

این تابع تاریخ میلادی معادل را بر می گرداند. یعنی در حقیقت تاریخ شمسی کلاس را به میلادی تبدیل کرده و بر می گرداند. خروجی این تابع نوع استاندارد دلفی TDateTime است.

در مثال زیر ابتدا کلاس با استفاده از تاریخ شمسی ایجاد می شود. سپس تاریخ میلادی معادل بدست می آید.

procedure TfrmDemo.btnFaGoClick(Sender: TObject);
var
faDate:TFaDate;
enDate:TDateTime;
begin
faDate:=TFaDate.CreateByPersianDate(txtYearFa.value,
txtMonthFa.value,txtDayFa.value);

enDate:=faDate.ToGregorianDate;
lblGregorianDate.Caption:=DateToStr(enDate);
end;
  • تابع GetGregorianDateString

GetGregorianDateString: string;

تابع میلادی معادل را به صورت رشته بر می گرداند.

procedure TfrmDemo.btnFaGoClick(Sender: TObject);
var
faDate:TFaDate;
enDate:TDateTime;
begin
faDate:=TFaDate.CreateByPersianDate(txtYearFa.value,
txtMonthFa.value,txtDayFa.value);

lblGregorianDate.Caption:=faDate.GetGregorianDateString;
end;
  • تابع GetDayOfWeek

GetDayOfWeek: Word;

این تابع روز از هفته را بر می گرداند.

  • تابع GetDayOfYear

GetDayOfYear: Word;

این تابع روز از سال را برمی گرداند.

  • تابع GetDaysInMonth

GetDaysInMonth: word;

این تابع تعداد روزها را در ماه جاری بر می گرداند.

ویژگی ها

ویژگی های این کلاس را در یکجا توضیح می دهم:

روز Day : word
ماه Month : word
سال Year : word
ساعت Hour : word
دقیقه Minute : word
ثانیه Second : word
میلی ثانیه MilliSecond : word
نام روز جاری از هفته (برای مثال شنبه) DayName : string
نام ماه جاری (برای مثال مرداد) MonthName : string
نام مخفف برای روز جاری ( مثلا برای "سه شنبه" مقدار "سه" است) DaySmallName : string
مشخص می کند که کلاس، زمان و ساعت را دارد یا نه.
وجود این مقدار به سازنده استفاده شده بستگی دارد که قبلا توضیح داده شد.
HasTime : boolean

 

ضمایم
UFaDate.zip
حجم : 4.00 KB  دفعات دریافت : 583
کلاس TFaDate همراه با کد های آن  
UFaDateDemo.zip
حجم : 217.00 KB  دفعات دریافت : 884
Demo از کلاس TFaDate همراه با فایل اجرایی کامپایل  
جزئـیات تاپيک
      
نویسنده: Salar Khalilzadeh
تاریخ ارسال: 1387/05/17 10:20 AM
تعداد مشاهده: 6663
تعداد آرا: 17
امتیاز آرا:   از 4.06 امتیاز

رای شما به این مطلب:

bookmark this
 

تعداد کل نظرات: 12
12 پاسخ: اسم توابع
 
در مورد انتخاب TfaDate یک سلیقه شخصی بود که مربوط به چند سال پیشه و تا حالا تغییرش ندادم. شاید نوشتن TfaDate راحت تر از TPersianDate باشه!
اما اسم توابع گویای عملکرد انها هستند. تمامی توابع به غیر آنهایی که شامل عبارت Gregorian هستند برای کار بر روی تاریخ شمسی هستند، پس نیازی به طولانی کردن نام ها با Persian یا fa نیست.
افزودن سال یا ماه به تاریخ فعلا پیاده سازی نشده و اگه عمری باشه این مجموعه توابع رو هم بهش اضافه می کنم و از شما به خاطر این یاداوری تشکر می کنم.
اما به عنوان یک راه حل موقت می تونی با استفاده از تابع ToGregorianDate تاریخ میلادی رو دریافت کنی و روز مورد نظر رو اضافه کنی و دوباره به شمسی تبدیل کنی.
var
  faDate:TFaDate;
  enDate:TDateTime;
begin
  faDate:=TFaDate.Create(Now);
  enDate:=faDate.ToGregorianDate;
  enDate:= IncDay(enDate,16);
  faDate:=faDate.CreateByGregorianDate(enDate);
 موفق باشید
  توسط: Salar Khalilzadeh در تاریخ: 1388/01/24 10:13 PM  پاسخ
11 اسم توابع
 
با تشکر از کلاس زیبا و کارا ...
جسارتا از اسامی فرار و عجیبی واسه کلاس و متدها استفاده کردی
مثلا  به جای TfaDate چرا از  TPersianDate یا TFarsiDate استفاده نمیکنی؟ یا مثلا به جای ToDateString چرا از PersianDateToString استفاده نکردی؟
اینجوری واسه استفاده از کلاس شما، همیشه باید یه لیست هم جلوم باز باشه تا یه وقت اسامی رو فراموش نکنم.
یه مشکل دیگه.
فرض کن یه سیستم یادآوری مناسبتها هم در برنامه گنجاندیم، که به کاربر میگه پانزده روز دیگه تاریخ سررسید فلان چک میرسه....یا یه کلوپی که میخواد اشتراک عضو رو 30 روز تمدید کنه... آیا میشه توسط کلاس شما، به تایخ شمسی، عددی را اضافه یا از اون کم کرد؟ (مثلا سی و یک روز) ... چطوری؟
  توسط: Afshin در تاریخ: 1388/01/20 2:08 PM  پاسخ
10 پاسخ: اعتراض نامه
 
جناب hr_110
منطقی در گفته های شما نمی بینم. تغییرات در این پروژه 3 بار بوده که نسخه اول عرضه شد. نسخه بعدی امکانات زیادی به آن اضافه شد و این هم نسخه آخری هست. شاید در این میان موارد رفع اشکالی هم وجود داشته است. اگر هم به نظر شما این ابزار بسیار ساده است پس برای چی از آن استفاده می کنید در حالی که می توانید به سادگی یکی مطمئن رو برای خودتون بنویسید!
اما در مورد این ابزار:
ابتدا عرض کنم که نسخه قبلی مشکلی از لحاظ الگوریتم نداشته و ندارد، تنها مشکل مربوط به استفاده از نوع استاندارد دلفی که TDateTime باشد بر می گردد. این باعث می شد که در برخی سالها کبیثه و نه همه آنها مشکل پیش بیاید. این شد که پس از گذشت دو سال از آن به طور کلی سیستم کار این کلاس را تعییر دادم.
در ضمن به همه دوستان عرض کنم، این یک ابزار کد باز هست و همونطور که ممکنه بدونید این ابزارها بدون مسئولیت یا "همانطور که هستند" عرضه می شوند. پس هیچ مسئولیتی یا نفعی درباره اینکه از این کد چه استفاده ای می کنید و چه عاید می شود، به شخص من مربوط نمی شود.
نمی دانم که برنامه نویسان ایرانی این موارد را کی یاد خواهند گرفت در حالی که مدتهاست این موارد در دنیای غیر ایرانی حل شده است!
در ضمن اینجا جای این بحث ها نیست اگر مشکلی نامربوط به این ابزار دارید از طریق پیغام مطرح کنید.
  توسط: Salar Khalilzadeh در تاریخ: 1387/11/03 7:24 PM  پاسخ
9 اعتراض نامه!
 
متاسفم كه اين ابزار بسيار ساده بايد تا كنون چندين بار تغيير كنه و خيلي از پروژه هاي دوستان منو كه تموم شده بودند بعد از ساليان سال مجبور كنه براي چندمين بار اين ابزار شما رو بروز كرده و مجدداً كامپايل كنه.
شما كه اينكاره نيستيد ، مگه مجبوريد كه برنامه بنويسيد!؟؟
  توسط: hr_110 در تاریخ: 1387/10/14 11:44 PM  پاسخ
8 لطفا این نسخه را با نسخه قدیمی اشتباه نگیرید
 
دوست عزیز جناب محمدی این نسخه جدید است و لطفا از نسخه جدید استفاده نمایید.
تابعی که نام بردید miladytoshamsistr در این نسخه جدید وجود ندارد و کار آن را تابعی دیگر انجام میده.
موفق باشی
  توسط: Salar Khalilzadeh در تاریخ: 1387/10/14 1:00 PM  پاسخ
7 یک اشکال کوچیک دیدم
 
سلام
تاریخ سیستم من اشتباها بر روی تاریخ 2009/01/31تنظیم بود
وقتی دمویی که گذاشته بودید را اجرا کردم
تابع miladytoshamsistr یک روز اشتباه نشان می داد و یک روز قبل را نشان می داد
یعنی به جای 1387/11/12 تاریخه 1387/11/11
گفتم عرض کنم که این مشکل را برای این تابع نیز بررسی کنید که همه چی بدون نقص باشه
دستتان درد نکند
  توسط: محمدی در تاریخ: 1387/10/11 8:45 PM  پاسخ
6 درخواست برنامه مبدل تاریخ میلادی به شمسی
 
سلام
آقای خلیل زاده خواهشمندم با توجه به اینکه در دریافت این برنامه مشکل وجود دارد این برنامه را در اولین فرصت برای بنده به آدرس world_4_mohsen@yahoo.comمیل نمایید.
با تشکر فراوان از شما
  توسط: mohsen3540 در تاریخ: 1387/09/14 2:05 AM  پاسخ
5 دلفی
 
سلام من نمیتونم دانلودکنما  بفرستید به میلم
ممنون میشم
 mah_esf2001@yahoo.com
  توسط: mahtab در تاریخ: 1387/07/16 2:06 AM  پاسخ
4 درخواست مبدل تاریخ میلادی به شمسی
 
با سلام
آقای خلیل زاده از آنجا که اخیرا برنامه شمارا دیدم خواهشمندم که برنامه را به آدرس من میل کنید چون دریافت برنامه از طریق لینک داده شده ایراد دارد    بی نهایت متشکرم
aran20008@yahoo.com
  توسط: aza_20008 در تاریخ: 1387/06/01 11:35 AM  پاسخ
3 برای دریافت باید عضو باشید
 
برای دریافت این فایل ها باید عضو سایت باشید.
و برای اینکه مشکلی در دریافت نداشته باشید بهتره که از یک نرم افزار دانلود استفاده کنید مانند FlashGet
  توسط: Salar Khalilzadeh در تاریخ: 1387/02/25 10:47 AM  پاسخ
زبان سایت:

Copyright © 2009 SoftProjects.org | About | Valid XHTML | CSS