در بیشتر وب سایتهای شاهد نمایش تاریخ بر حسب تعداد روز/ ماه و یا سال گذشته شده از آن تاریخ هستیم. برای نمونه در سایت جاری تاریخ را بر همین اساس نمایش میدهند. نمونهای از آن مانند «در ۲ سال قبل، چهار شنبه ۲۷ دی ۱۳۹۱، ساعت ۰۳:۳۵» میباشد. در این مقاله قصد دارم کدهایی را جهت انجام این کار ارائه کنم. در این مثال که در ادامه شاهد آن خواهیم بود، از یک پروژهی Win form ساده، جهت نمایش بهتر استفاده کردهام.
توضیح: اگر ساعت یا دقیقه تک رقمی باشد، یعنی کمتر از 10، برای نمایش بهتر آن یک صفر را به ابتدای آن اضافه میکنیم. یعنی ساعت 1:5 تبدیل میشود به 01:05
و در هر جایی نیاز به گرفتن تاریخ باشد، به صورت زیر عمل خواهیم کرد:
pc یک متغییر از نوع persianclander میباشد.
وجود -1 در هنگام return به این دلیل است که زمانیکه قصد دریافت شماره ماه را از شیء PersianClander داشته باشیم، از یک شروع میشود. یعنی برای ماه اسفند مقدار 12 و برای ماه فروردین مقدار 1 و در یک آرایه، ایندکسها از صفر شروع میشوند.
چرا از if استفاده شده است؟ فرض کنید تاریخ امروز 2/12/2015 باشد و تاریخی که قصد تبدیل آن را داریم :10/12/2014 است. تعداد اختلافی که بین تعداد ماهها است 8 ماه است و اگر این بررسی چک کردن بزرگ بودن آن دو انجام نشود، مقدار 8- را بر میگرداند که برای کار ما نادرست است.
نمونهای از این تبدیل :
جهت اینکه درک کد و یا توضیح آن نیز سادهتر صورت بگیرد، به نظرم ابتدا متدهای مورد استفاده و کلاسهایی را که از آنها استفاده کردهام، معرفی کنم بهتر باشد:
از کلاس Persiancalender جهت گرفتن روز/ماه و سال استفاده شده و سه متد به شرح زیر دارد:
GetHour : از این متد برای گرفتن ساعت تاریخ مورد نظر استفاده میشود. کد این متد به صورت زیر است:
public string GetHour(DateTime lastdate) { PersianCalendar pc = new PersianCalendar(); string result = " ساعت " + (((pc.GetHour(lastdate)) < 10) ? ("0" + pc.GetHour(lastdate).ToString()) : (pc.GetHour(lastdate)).ToString()) + ":" + (((pc.GetMinute(lastdate)) < 10) ? ("0" + pc.GetMinute(lastdate).ToString()) : (pc.GetMinute(lastdate)).ToString()); return result; }
متد getDay : از این متد برای گرفتن نام روز مورد نظر استفاده میشود. ورودی این متد یک enum از نوع DayOfWeek است:
public string getDay(DayOfWeek day) { string Result = ""; switch (day) { case DayOfWeek.Friday: Result = "جمعه"; break; case DayOfWeek.Monday: Result = "دوشنبه"; break; case DayOfWeek.Saturday: Result = "شنبه"; break; case DayOfWeek.Sunday: Result = "یکشنبه"; break; case DayOfWeek.Thursday: Result = "پنج شنبه"; break; case DayOfWeek.Tuesday: Result = "سه شنبه"; break; case DayOfWeek.Wednesday: Result = "چهارشنبه"; break; default: break; } return Result; }
getDay(pc.GetDayOfWeek(LastDate))
متد GetMounth : همانطور که از نام این متد معلوم است، کار آن بازگشت نام ماه مورد استفاد است. کد آن نیز به صورت زیر میباشد:
public string GetMounth(int month) { string[] monthInYear = {"فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند" }; return monthInYear[month-1]; }
و اما کد کامل آن برای تبدیل تاریخ، به صورت رشته مورد نظر، به صورت زیر است:
private void btnGetDate_Click(object sender, EventArgs e) { DateTime LastDate = DateTime.Parse(txtLastDate.Text); TimeSpan ts = DateTime.Now - LastDate; PersianCalendar pc = new PersianCalendar(); int DifferenceYear = DateTime.Now.Year - LastDate.Year; int DiffernceMounth = DateTime.Now.Month - LastDate.Month; if(DateTime.Now.Month>LastDate.Month) DiffernceMounth = DateTime.Now.Month - LastDate.Month; else DiffernceMounth=LastDate.Month-DateTime.Now.Month; int DifferenceDays = ts.Days; StringBuilder Result = new System.Text.StringBuilder(""); if(DifferenceYear>0) { Result.Append(DifferenceYear.ToString() + " سال پیش"+" ، "+getDay(pc.GetDayOfWeek(LastDate))+" "+pc.GetDayOfMonth(LastDate).ToString()+" " + GetMounth(pc.GetMonth(LastDate))+" " +pc.GetYear(LastDate)+GetHour(LastDate)); } else if(DiffernceMounth>0) { Result.Append(DiffernceMounth.ToString() + " ماه پیش" + " ، " + getDay(pc.GetDayOfWeek(LastDate)) + " " + pc.GetDayOfMonth(LastDate).ToString() + " " + GetMounth(pc.GetMonth(LastDate)) + " " + pc.GetYear(LastDate) + GetHour(LastDate)); } else if(DifferenceDays>0) Result.Append(DifferenceDays.ToString() + " روز پیش" + " ، " + getDay(pc.GetDayOfWeek(LastDate)) + " " + pc.GetDayOfMonth(LastDate).ToString() + " " + GetMounth(pc.GetMonth(LastDate)) + " " + pc.GetYear(LastDate) + GetHour(LastDate)); else if(DifferenceDays==0) Result.Append(" امروز" + " ، " + getDay(pc.GetDayOfWeek(LastDate)) + " " + pc.GetDayOfMonth(LastDate).ToString() + " " + GetMounth(pc.GetMonth(LastDate)) + " " + pc.GetYear(LastDate) + GetHour(LastDate)); lblResult.Text = Result.ToString(); }
کد زیر برای دریافت تعداد اختلاف بین ماهها، از تاریخی گذشته تا تاریخ جاری است:
if(DateTime.Now.Month>LastDate.Month) DiffernceMounth = DateTime.Now.Month - LastDate.Month; else DiffernceMounth=LastDate.Month-DateTime.Now.Month;