behzad1986
یک شنبه 08 فروردین 1389, 09: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
من در حال نوشتن يه پروژه بودم كه نياز به گزارش گيري شدم كه در اون بايد تاريخ و به شمسي نمايش مي دادم واسه همين به دنبال روشي براي اين كار گشتم تنها راهي كه پيدا كردم استفاده از 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