PDA

View Full Version : آموزش: تبديل تاريخ ميلادي به شمسي



behzad1986
یک شنبه 08 فروردین 1389, 08:31 صبح
سلام دوستان
من در حال نوشتن يه پرو‍ژه بودم كه نياز به گزارش گيري شدم كه در اون بايد تاريخ و به شمسي نمايش مي دادم واسه همين به دنبال روشي براي اين كار گشتم تنها راهي كه پيدا كردم استفاده از dll هايي كه تعداي از برنامه نويسا واسه تبديل تاريخ نوشته بودن كه يه كم استفاده از اونا مشكل بود منم يه تابع براي اينكار نوشتم اين كد به زبان C#‎ و تو بخش گزارش گيري تابع فرموله اون براي كريستال ريپورت رو هم قرار مي دم
اين كد براي 1000 سال تست شده!!!

class PersianDate
{
public String PersianDate(DateTime date)
{
int[] DaysToMonth365 = new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
int[] DaysToMonth366 = new int[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
int[] DaysToMonth = new int[] { 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336 };
int[] LeapYears33 = new int[] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 };
bool IsLeapYear;
int year = date.Year;
int day = date.Day;
int month = date.Month;
if ((year % 4) != 0)
{
IsLeapYear = false;
}
else if ((year % 100) == 0)
{
IsLeapYear = (year % 400) == 0;
}
else
IsLeapYear = true;
int[] numArray1;
if (IsLeapYear)
numArray1 = DaysToMonth366;
else
numArray1 = DaysToMonth365;

int num1 = year - 1;
int num2 = ((((((num1 * 365) + (num1 / 4)) - (num1 / 100)) + (num1 / 400)) + numArray1[month - 1]) + day) - 1;
long num4 = num2 + 1;
int PersianYear = ((int)(((num4 - 226894) * 33) / ((long)12053))) + 1;

int numtmp2 = (PersianYear - 1) / 33;
int yeartmp = (PersianYear - 1) % 33;
long num5 = (numtmp2 * 12053) + 226894;
while (yeartmp > 0)
{
num5 = num5 + 365;
if (LeapYears33[yeartmp % 33] == 1)
{
num5 = num5 + 1;
}
yeartmp = yeartmp - 1;
}
MessageBox.Show(num5.ToString() );
long num6;
if (PersianYear == 9378)
{
num6 = DaysToMonth[9] + 10;
}
else if (!(LeapYears33[PersianYear % 33] == 1))
{
num6 = 365;
}
else
num6 = 366;
if (num4 < num5)
{
num5 = num5 - num6;
PersianYear = PersianYear - 1;
}
else if (num4 == num5)
{
PersianYear = PersianYear - 1;
int temp;
if (PersianYear == 9378)
{
temp = DaysToMonth[9] + 10;
}
else if (!(LeapYears33[PersianYear % 33] == 1))
{
temp = 365;
}
else
temp = 366;
num5 = num5 - temp;
}
else
{
if (num4 > (num5 + num6))
{
num5 = num5 + num6;
PersianYear=PersianYear+1 ;
}
}

num4= num4 - num5;
int num12 = 0;
while ((num12 < 12) && (num4 > DaysToMonth[num12]))
{
num12=num12+1;
}
int num3 = ((int)num4) - DaysToMonth[num12 - 1];
return PersianYear.ToString()+"/" + num12.ToString()+"/"+ num3.ToString() ;
}
}
اين هم لينك كريستال ريپورت
http://barnamenevis.org/forum/showthread.php?p=939768#post939768

happy65_sh
یک شنبه 08 فروردین 1389, 09:03 صبح
سلام
چرا از persionCalender استفاده نكردي؟:متفکر:خيلي راحته و با 5 خط كد تاريخ ميلادي را مي توني به شمسي تبديل كني.

behzad1986
یک شنبه 08 فروردین 1389, 09:14 صبح
چون مي خواستم تابع كيرستال ريپورت و تابعشو تو sqL بنويسم و واسه اينكه از persian Calendar استفاده نكنم!!!!!!!!!!!!!

teardrop
یک شنبه 08 فروردین 1389, 09:14 صبح
به نام خدا
از این استفاده کن خیلی امکانات میده.

behzad1986
یک شنبه 08 فروردین 1389, 09:20 صبح
اين كلاس مخصوصا تو يه تابع نوشته شده كه به راحتي قابل تبديل به زبان هاي ديگه و بخصوص زبانهايي كه مبتني بر .net نيستند بشه!!!!!!!!!!
كلاس كاملترش هست اگه دوستان بخوان فايلشو واسه استفاده مي زارم!!!!!!

mohammad diba
یک شنبه 08 فروردین 1389, 12:10 عصر
دوست عزیز میتونی تابع sql رو بذاری من لازمش دارم ممنون می شم.

ali_autumnal
یک شنبه 08 فروردین 1389, 13:01 عصر
از این لینک ای که گذاشتم در امضای خودم استفاده کن خیالت راحت بشه. حتی طرز استفاده از اون رو هم گفتم. اسمش هست یه dll ناب که روزهای تعطیل رو هم بهت میگه.

mohammad diba
یک شنبه 08 فروردین 1389, 14:43 عصر
سلام علی آقا خوبید راستی می خواستم ببینم از این DLL شما می شه تویه sql استفاده کرد؟ چه کار باید بکنبم من از sql 2008 استفاده می کنم.