PDA

View Full Version : مشکل عجیب در DateTime



menevlster
یک شنبه 17 بهمن 1389, 22:00 عصر
دوستان سلام
من در پروژه ام با استفاده از کد زیر از تقویم فارسی استفاده می کنم


DefaultCulture = new System.Globalization.CultureInfo(System.Threading. Thread.CurrentThread.CurrentUICulture.Name);

System.Globalization.DateTimeFormatInfo info = SelectedCulture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";

info.FirstDayOfWeek = DayOfWeek.Saturday;
info.FullDateTimePattern = "yyyy MMMM dddd, dd HH:mm:ss";
info.LongDatePattern = "yyyy MMMM dddd, dd";
info.ShortDatePattern = "yyyy/MM/dd";

info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();

typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (SelectedCulture, cal);

System.Threading.Thread.CurrentThread.CurrentCultu re = SelectedCulture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = SelectedCulture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;




حال در بخشی از پروژه از تاریخ میلادی استفاده می کنم به اینصورت که تاریخ فارسی را به میلادی تبدیل کرده وبه تاریخ بدست آمده یک روز اضافه می شود اما نتیجه بدست آمده بر اساس استانداردهای تاریخ میلادی نیست مثلا اگر تاریخ 06/30/2010 را بر اساس AddDays یک روز اضافه کنیم تاریخ 06/31/2010 بدست می آید
درصورتیکه تاریخ بایستی بصورت 07/01/2010 باشد.
حال مشکل از چیست؟
کدهای تبدیل و اضافه کردن یک روز:



public bool IsLeapYear(int year, int era)
{
return IsLeapYear(true, year, era);
}
private static bool HasLeapFrac(int year)
{
double a = 31 * ((double)year + 38) / 128;
if (a - Math.Floor(a) < 0.31)
return true;
return false;
}
private bool IsLeapYear(bool validate, int year, int era)
{
if (HasLeapFrac(year) && !HasLeapFrac(year - 1))
return true;
return false;
}
private int NumberOfLeapYearsUntil(bool validate, int year)
{
int count = 0;
for (int i = 4; i < year; i++)
{
if (IsLeapYear(false, i, 0))
{
count++;
i += 3;
}
}
return count;
}
public DateTime ToGregorainDateTime(int year, int month, int day, int hour, int minute, int second,int millisecond)
{
int days = day;
for (int i = 1; i < month; i++)
{
if (i < 7) days += 31;
else if (i < 12) days += 30;
}
days += 365 * year + NumberOfLeapYearsUntil(false, year);
DateTime timePart = new DateTime(1, 1, 1, hour, minute, second, millisecond);
long ticks = days * 864000000000L + timePart.Ticks + 195721056000000000L;
return new DateTime(ticks);
}



pd تاریخ فارسی و gd تاریخ میلادی بدست آمده مثلا 06/30/2010 که صحیح می باشد

DateTime gd = ToGregorainDateTime(pd.Year, pd.Month, pd.Day, 0, 0, 0, 0);


در کد زیر به تارخ میلادی یک روز اضافه می شود و نتیجه 06/31/2010 است چرا؟ تاریخ درست 07/01/2010 است


gd = gd.AddDays(1);