PDA

View Full Version : تبدیل تاریخ میلادی به شمسی بدون نیاز به فایلهای DLL ( گام به گام )



khazon
پنج شنبه 06 دی 1386, 00:56 صبح
به نام خالق عشق و ایمان

پیش درامد :
خب آموزش ما در مورد تبدیل تاریخ میلادی به تاریخ شمسی می باااااشد .
این آموزش بر اساس زبون VB می باشد و فکر میکنم تفاوت چندانی با #C نداشته باشه و فقط سیمی کالن آخرش رو بذارین جواب بده ( البته تست نکردم )
آهان ، تا یادم نرفته این سورس کد ها فقط برای 2 Net. جواب میده و برای 1 Net. باید از فایل های DLLی که به پرژه وصل میشن و آماده هستن استفاده کنید .
به عنوان یه دوست که تازه دات نت 2 رو آغاز کردم بهتون میگم که اگه تا حالا از 2 استفاده نکردین بهتره که برین و حتما باهاش کار کنین چون اون غولی نسیت که فکر میکنید ...
تازه دات نت 3.5 اومده و باید بریم سراغ اون .

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

مرحله ی 1 :
ما یه شیء داریم به نام System.Globalization.PersianCalendar که همونطور که مشخصه برای تبدیل به تاریخ شمسی کار میره .
قبل از Page Load این تو خط رو اضافه کنید :



Dim fary, farm, fard, fardw As String
Dim far30 As New System.Globalization.PersianCalendar


میشه تو قسمت page load هم تعریف شه ولی با این کار بعد از پایان Load این متغییر ها دیگه قابل دسترسی نیستن و حذف می شن .
تو ِDim اول چند متغیر داریم که :

fary برای سال ، farm برای ماه ، fard برای روز و fardw برای روز هفته می باشد .
چون ما می خوایم یه تاریخ با کلاس داشته باشیم : حالا همه با هم :شیطان:

Dim دوم متغیری به نام far30 رو از نوع System.Globalization.PersianCalendar تعیریف میکنه . به New هم دقت کنین ...

مرحله ی دوم یه Label به صفحه اضافه کنین .

مرحله ی سوم : تو قسمت Page Load متغییر هامونو مقدار دهی میکنیم :



fary = far30.GetYear(DateAndTime.Now)
fary = Right(fary, 2)
farm = far30.GetMonth(DateAndTime.Now)
fard = far30.GetDayOfMonth(DateAndTime.Now)
fardw = far30.GetDayOfWeek(DateAndTime.Now)


نکته : وقتی که از تابع DateAndTime.Now استفاده میکنیم یعنی تاریخ و ساعت سروری که داریم ازش استفاده میکنیم و اگه ما در حین اجرا بریمو ساعت سیستممون رو دستکاری کنیم یا تاریخو در refresh بعدی ، مقدار ها تغییر میکنن . اما این پرژه تو اینترنت تاریخ و ساعت سرور خودشو میگیره نا کاربری که به سایت وصل شده ... آخع کد های جاوایی که تو وبلاگ ها استفاده میشه ، تاریخ و ساعت سیستم کاربر رو میگیره نه سرور رو ...

جالا اگه ما Label ی که ساختیم رو اینطوری مقدار بدیم یه تاریخ بی کلاس رو بر میگردونه ولی تاریخمون دسته ، فقط جلوه ی خوبی نداره :



Label1.Text = fardw + " , " + fard + " " + farm + " " + fary


حالا ما باید چیکار کنیم تا تاریخ رو بهتر نمایش بدیم ؟

قبل از کد بالا ( کدی که مقدار تاریخ رو Label میده ) ، آها ،همین کد بالایی !!! این کد رو بذارین :



If farm = "1" Then
farm = "فروردین"
End If
If farm = "2" Then
farm = "اردیبهشت"
End If
If farm = "3" Then
farm = "خرداد"
End If
If farm = "4" Then
farm = "تیر"
End If
If farm = "5" Then
farm = "مرداد"
End If
If farm = "6" Then
farm = "شهریور"
End If
If farm = "7" Then
farm = "مهر"
End If
If farm = "8" Then
farm = "آبان"
End If
If farm = "9" Then
farm = "آذر"
End If
If farm = "10" Then
farm = "دی"
End If
If farm = "11" Then
farm = "بهمن"
End If
If farm = "12" Then
farm = "اسفند"
End If

'-----
If fardw = "6" Then
fardw = "شنبه"
End If
If fardw = "0" Then
fardw = "یکشنبه"
End If
If fardw = "1" Then
fardw = "دوشنبه"
End If
If fardw = "2" Then
fardw = "سه شنبه"
End If
If fardw = "3" Then
fardw = "چهارشنبه"
End If
If fardw = "4" Then
fardw = "پنج شنبه"
End If
If fardw = "5" Then
fardw = "جمعه"
End If
'-----


کد نویسی از این بی کلاس تر دیده بودین ...
حالا ما چکار کنیم !!! تا از این همه سورس خلاص شیم و فقط یه باز کد نویسی کنیم و با یه خط تاریخ رو تبدیل کنیم ، اینه که ما از یه فایل مرجع استفاده کنیم که هر جایی که خواستیم صداش کنیم تا بیادو به دادمون برسه ...
مصل یه Function که بالای برنامه باشه و هر وقت خواستیم صداش بزنیم ...
تفاوتش با Function چیه ؟ اینه که Function فقط مخصوص همون صفحه ست و ما با کلاس می تونیم هرکجای برنامه که خواستیم ، Function اونو صدا بزنیم ...
اگه دوستان می خوان طریقه ی استفاده از کلاس رو بدونن ، تو همین مطلب بگن تا روشش رو توضیح بدم .

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

نکته ی خیلی خیلی مهمی که باید بگم اینه که کاربرد اصلی این بدست آوردن تاریخ چیه و کجا میشه ازش استفاده ی بهینه کرد ؟
از این روز و ماه و سال میشه یه استفاده ی غیر استاندارد هم کنیم ...! برای آمار بازدید سایتمون !!!
غیر استانداردش اینه که فقط رو یه رکورد کار میکنیم ... نه اینکه یه دیتا بیس خفن ناک با تعداد بازدید رکورد داشته باشیم و بخوایم یه * Select بذاریمو هوووووه ... چک کردن و شمودنو ...

بدون دردسر با چندین خط یه آمار بازدید ( دیروز ، امروز ، هفته ، ماه ، کل ) دقیق میشه نوشت .
فقط دوستان درخواست بدن تا بذارم براتون ...

خب ، خوشحال شدم
با تشکر : حامد عبدالهی
یا علی

Chabok
پنج شنبه 06 دی 1386, 08:12 صبح
با سلام
از مقاله شما ممنونم
چون خودتون گفتین یه راه ساده تر که این همه If ننویسیم اینو نوشتم :


Dim FMns As String() = {"", "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند"}


Dim FDys As String() = {"یک شنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه", "شنبه"}
حالا اگه روز در هفته و ماه رو داشته باشیم میتونیم اینطوری استفاده کنیم :


Dim FDy, FMn As String
FMn = FMns(Far30.GetMonth(Now))
FDy = FDys(Far30.GetDayOfWeek(Now)))موفق باشید . خدانگهدار


اصلاحیه :
************************************
یک مشکل کوچک در کد بالا رفع شد
نمی دونم چرا این آرایه ها رو برعکس میاره اینجا.
کد صحیح به این صورت می باشد :

http://i7.tinypic.com/6y30c5s.jpg

mahdi_farhani
پنج شنبه 06 دی 1386, 14:34 عصر
با تشکر از مطلب مفیدتون ولی اگر قلبش یه سرچ میکردید بد نبود ،
با این پست یه نگاهی بنداز .
http://barnamenevis.org/forum/showthread.php?t=84258
پست شماره 10 یه نگاهی بنداز