PDA

View Full Version : آموزش: تبدیل تاریخ شمسی به میلادی و بالعکس با استفاده از Extension Methods



clover
شنبه 02 مهر 1390, 12:44 عصر
سلام
از اونجایی که تا الان پست های زیاد و همچنین راه حل های زیادی برای تبدیل تاریخ شمسی به میلادی و بالعکس دیدم، تصمیم گرفتم من هم یه راه حل ساده اما کاربردی برای این کار پیشنهاد بدم، توی این راه حل نیاز به ساختن اشیا از کلاس های مبدل نیست، من فقط از یکی از قابلیت های جدید C#‎ 3.0 که همون Extension Method ها هست استفاده کردم و به کلاس DateTime متد هایی برای تبدیل به تاریخ شمسی و همینطور به کلاس string متدی برای تبدیل به تاریخ میلادی دادم.

کاری که باید انجام بدید اضافه کردن کلاس زیر به برنامه ی مورد نظر هست:

using System;
using System.Globalization;
using System.Text.RegularExpressions;


public static class Extentions
{
public static String ToPersianDate(this DateTime dateTime)
{
PersianCalendar persianCalendar = new PersianCalendar();
return string.Format("{0}/{1:00}/{2:00}",
persianCalendar.GetYear(dateTime),
persianCalendar.GetMonth(dateTime),
persianCalendar.GetDayOfMonth(dateTime));
}

public static String ToPersianDateTime(this DateTime dateTime)
{
PersianCalendar persianCalendar = new PersianCalendar();
return string.Format("{0}/{1:00}/{2:00} ساعت {3:00}:{4:00}",
persianCalendar.GetYear(dateTime),
persianCalendar.GetMonth(dateTime),
persianCalendar.GetDayOfMonth(dateTime),
persianCalendar.GetHour(dateTime),
persianCalendar.GetMinute(dateTime));
}

public static String ToPersianTime(this DateTime dateTime)
{
PersianCalendar persianCalendar = new PersianCalendar();
return string.Format("ساعت {0:00}:{1:00}",
persianCalendar.GetHour(dateTime),
persianCalendar.GetMinute(dateTime));
}

public static DateTime ToDateTime(this string objDate)
{
int year = 0;
int month = 0;
int day = 0;
PersianCalendar persianCalendar = new PersianCalendar();

string date = objDate as string;
Match match;

if (Regex.IsMatch(date, @"^((0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](13|14)?\d{2})|((13|14)\d{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))$"))
{
match = Regex.Match(date, @"^((0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.]((13|14)?\d{2}))|(((13|14)\d{2})[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))$");

if (match.Groups[1].Success)
{
day = Convert.ToInt32(match.Groups[2].Value);
month = Convert.ToInt32(match.Groups[3].Value);

if (match.Groups[5].Success)
{
year = Convert.ToInt32(match.Groups[4].Value);
}
else
{
year = Convert.ToInt32(string.Format("{0:00}{1:00}", persianCalendar.GetYear(DateTime.Now) / 100, match.Groups[4].Value));
}
}
else
{
day = Convert.ToInt32(match.Groups[10].Value);
month = Convert.ToInt32(match.Groups[9].Value);
year = Convert.ToInt32(match.Groups[7].Value);
}
}
else
{
throw new Exception("Invalid Date Expression");
}

return persianCalendar.ToDateTime(year, month, day, 0, 0, 0, 0);
}
}

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

string persianDateTime = DateTime.Now.ToPersianDateTime();
DateTime georgianDateTime = "21/8/90".ToDateTime();

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

موفق باشید

ahmad156
سه شنبه 13 تیر 1391, 19:57 عصر
دوست عزیز اگر تاریخ شمسی و ساعت داشته باشیم و بخواهیم تبدیل به DateTime کنیم چی؟