PDA

View Full Version : سوال: مشکل در کلاس تبدیل میلادی به شمسی



behnam3000
چهارشنبه 01 مهر 1394, 18:18 عصر
در تاریخ 31 آگوست مشکل دارد ( DateTime ارور 30 روز میدهد )لطفا کمکم کنید
2015/8/31 یا 1394/06/09 ارور نمیده ولی datetime میگه باید برج 8 تعداد روزش 31 باشه
public class DateConvertor
{

// Convert Function ------------------------------------
public string MiladiToShamsi(DateTime Milady, Boolean OnlyDate)
{
if (Milady == null)
return null;
int shamsiDay, shamsiMonth, shamsiYear;
int dayCount, farvardinDayDiff, deyDayDiff;
int[] sumDayMiladiMonth = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
int[] sumDayMiladiMonthLeap = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };

farvardinDayDiff = 79;

if (MiladiIsLeap(Milady.Year))
{
dayCount = sumDayMiladiMonthLeap[Milady.Month - 1] + Milady.Day;
}
else
{
dayCount = sumDayMiladiMonth[Milady.Month - 1] + Milady.Day;
}
if ((MiladiIsLeap(Milady.Year - 1)))
{
deyDayDiff = 11;
}
else
{
deyDayDiff = 10;
}
if (dayCount > farvardinDayDiff)
{
dayCount = dayCount - farvardinDayDiff;
if (dayCount <= 186)
{
switch (dayCount % 31)
{
case 0:
shamsiMonth = dayCount / 31;
shamsiDay = 31;
break;
default:
shamsiMonth = (dayCount / 31) + 1;
shamsiDay = (dayCount % 31);
break;
}
shamsiYear = Milady.Year - 621;
}
else
{
dayCount = dayCount - 186;
switch (dayCount % 30)
{
case 0:
shamsiMonth = (dayCount / 30) + 6;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 7;
shamsiDay = (dayCount % 30);
break;
}
shamsiYear = Milady.Year - 621;
}
}
else
{
dayCount = dayCount + deyDayDiff;

switch (dayCount % 30)
{
case 0:
shamsiMonth = (dayCount / 30) + 9;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 10;
shamsiDay = (dayCount % 30);
break;
}
shamsiYear = Milady.Year - 622;

}
if (OnlyDate == false)
{
String Hour, Minute;
if (Milady.Hour < 10) { Hour = "0" + Milady.Hour; } else { Hour = Convert.ToString(Milady.Hour); }
if (Milady.Minute < 10) { Minute = "0" + Milady.Minute; } else { Minute = Convert.ToString(Milady.Minute); }

return (shamsiYear + "/" + shamsiMonth + "/" + shamsiDay + " " + Hour + ":" + Minute);
}
else
{
return (shamsiYear + "/" + shamsiMonth + "/" + shamsiDay);
}

}
لطفا کمکم کنید خیلی مهمه برام موقع نمایش مشکل نداره ولی موقع محاصبه مشکل داره

davidrobert
چهارشنبه 01 مهر 1394, 21:45 عصر
دوست عزیز من سورس تبدیل تاریخ میلادی به شمسی رو با سورس خیلی کم قرار دادم ببین http://barnamenevis.org/showthread.php?505417-%D8%B3%D9%88%D8%B1%D8%B3-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%A8%D9%87-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%87%D8%A7-%D9%88-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE در این تایپک هستش

behnam3000
جمعه 03 مهر 1394, 01:49 صبح
دوست عزیز من سورس تبدیل تاریخ میلادی به شمسی رو با سورس خیلی کم قرار دادم ببین http://barnamenevis.org/showthread.php?505417-%D8%B3%D9%88%D8%B1%D8%B3-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%A8%D9%87-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%87%D8%A7-%D9%88-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE در این تایپک هستش
سلام دیوید جان من برای تبدیلش مشکلی ندارم
ولی datetime ویژوال استدیو میگه برج هشت میلادی باید بین 0 تا 30 روز باشه ولی همون جور که میدونی 31 میشه
جالبیش اینه حتی ارور هم نمیده ولی وقتی میخوای تعداد روز بین دو تاریخ رو بدست بیاری این کارو انجام نمیده
مثلا تاریخ ها رو به صورت میلادی داری تاریخ اول 2015/08/15 تاریخ دوم 2015/08/31 تعداد روز رو نمیده و میگه برج 8 میلادی 30 روزست

davidrobert
جمعه 03 مهر 1394, 08:57 صبح
دوست عزیز ماه ایرانی 6 ماه اولش 31 روزه میشه و ماه های بعدش 30 و 29 روزه میشه بخاطر همین ماه 8 رو من تو 3 تا تقویم دیدم 30 روزه هستش و برای تاریخ من بهتر میدونم از date استفادهکنید نهdatettime چون DateTime ساعت رو میخواد ولی Date فقط تاریخ میدی راحت و اون سورس که دادم معادل شمسی به میلادی درست حساب میکنه و خطا نمیده و این رو هم بگم داخل دیتابیس تو میتونی نوع date تاریخ شمسی بده ولی ایرادی که داره این هستش که در ماه دوم و چهارم تاریخ 31 رو خطا میده ولی با تبدیل شمسی به میلادی کارت راحت میشه و از طرف دیگه شمسی میده اطلاعات ملادی محاسبه میکنه و میاره.

سیدسبحان
جمعه 03 مهر 1394, 09:46 صبح
سلام
این کد شما رو من نفهمیدم میخاد چکار کنه
ولی ویژوال استودیو خودش تبدیل شمسی به میلادی و برعکس رو داره.
شما نیاز نیست این همه کد بنویسید:

https://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar(v=vs.110).asp x

بسیار راحت و ساده
فقط datetime میدی بهش، خودش شمسی برمیگردونه. توی یه خط . راحت راحت

ژیار رحیمی
جمعه 03 مهر 1394, 16:27 عصر
دوست گرامی همانطور دوستان دیگه اشاره کردن چرا از کلاس PersianCalendar دات نت استفاده نمیکنی؟ نحوه استفاده شم بسیار آسان هست.

using System.Globalization;


نجوه فراخوانی

public static string Convert2Persian(string date)
{
var _pc = new PersianCalendar();
var geoDate = DateTime.Parse(date);
return string.Format("{2}/{1}/{0}", _pc.GetDayOfMonth(geoDate).ToString("00"), _pc.GetMonth(geoDate).ToString("00"), _pc.GetYear(geoDate).ToString("0000"));


}


یا

public static string Convert2Persian(DateTime date)
{
var _pc = new PersianCalendar();
return string.Format("{2}/{1}/{0}", _pc.GetDayOfMonth(geoDate).ToString("00"), _pc.GetMonth(geoDate).ToString("00"), _pc.GetYear(geoDate).ToString("0000"));


}