ورود

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



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

Function (datevar MyDate)
(
numbervar MyYear:=year(MyDate);
numbervar MyMonth:=month(MyDate);
numbervar MyDay:=datepart('D',MyDate);

numbervar array DaysToMonth365 := [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 ];
numbervar array DaysToMonth366 := [ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 ];
numbervar array DaysToMonth := [ 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336 ];
numbervar array LeapYears33 := [ 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 ];

booleanvar IsLeapYear;
if ((myyear mod 4) <> 0) then
IsLeapYear := false
else if ((myyear mod 100) = 0) then
IsLeapYear := ((myyear mod 400) = 0)
else
IsLeapYear := true;

numbervar array numArray1;

if (IsLeapYear) then
numArray1 := DaysToMonth366
else
numArray1 := DaysToMonth365;


numberVar num1 := int( myyear - 1);
numberVar num2 := int(((((((num1 * 365) + (num1 / 4)) - (num1 / 100)) + (num1 / 400)) + numArray1[mymonth]) + myday) - 1);
numberVar num4 := num2 + 1;
numberVar PersianYear := int((((num4 - 226894) * 33) / (12053)))+ 1;

numberVar numtmp2 :=int( (PersianYear - 1) / 33);
numberVar yeartmp := int((PersianYear - 1) mod 33);
numberVar num5 := (numtmp2 * 12053) + 226894;
while (yeartmp > 0) do
(
num5 := num5 + 365;
if (LeapYears33[(yeartmp Mod 33)+1] = 1) then
num5 := num5 + 1;
yeartmp := yeartmp - 1
);
numberVar num6;
num5;
if (PersianYear = 9378) then
num6 := DaysToMonth[10] + 10
else if (LeapYears33[(PersianYear Mod 33)+1] <> 1) then
num6 := 365
else
num6 := 366;

if (num4 < num5) then
(
num5 := num5 - num6;
PersianYear := PersianYear - 1;
)
else if (num4 = num5) then
(
PersianYear := PersianYear - 1;
numberVar temp;
if (PersianYear = 9378) then
temp := DaysToMonth[10] + 10
else if (LeapYears33[(PersianYear mod 33)+1] <> 1) then
temp := 365
else
temp := 366;
num5 := num5 - temp
)
else if (num4 > (num5 + num6)) then
(
num5 := num5 + num6;
PersianYear:=PersianYear+1
);


num4:= num4 - num5;
numberVar num12 := 0;
while ((num12 < 12) and (num4 > DaysToMonth[num12+1])) do
(
num12:=num12+1;
);
numberVar num3 := int(num4) - DaysToMonth[num12];
Stringvar Text :=Cstr( PersianYear,'0000')+'/'+Cstr(num12,'00')+'/'+Cstr(num3,'00');

)
يه تابعه و طريقه استفاده از اون هم ...

ConvertDateToPersianDate(CurrentDate );
اين هم لينك كد C#
http://barnamenevis.org/forum/showthread.php?p=939766#post939766

ASKaffash
یک شنبه 08 فروردین 1389, 11:20 صبح
سلام
تحت دات نت کلاس PersianCalendar تبدیل شمسی به میلادی و بالعکس را انجام میدهد

maya2010
سه شنبه 17 فروردین 1389, 12:10 عصر
کد مورد نظر رو باید در کجا قرار بدم؟
ConvertDateToPersianDate(CurrentDate );

behzad1986
چهارشنبه 18 فروردین 1389, 13:35 عصر
کد مورد نظر رو باید در کجا قرار بدم؟
ConvertDateToPersianDate(CurrentDate );
يه فرموله بسازيد
تو قسمتReport Custom Function يه تابه بسازيد (مثل عكس)
بعد كد تابع اونجا كپي كنيد و ذخيره كنيد (مثل عكس)
حالا يه فرموله بسازيد و از تابع استفاده كنيد ورودي تابع date (مثل عكس)
بعد فرموله رو به گزارشتون اضافه كنيد