PDA

View Full Version : خطا در محاسبات تاريخي



hamidprogramer
شنبه 16 آبان 1388, 09:36 صبح
چرا نتيجه اين دستور در حالتي كه تقويم ويندوز قمري باشد، اشتباه است؟

System.Globalization.PersianCalendar Pc = new System.Globalization.PersianCalendar();
Label1.Text = Pc.GetYear(DateTime.Parse("2009/11/08")).ToString();
سال خروجي بايد 1388 باشد كه اين طور نيست، اين مورد در توابع ديگر اين كلاس قابل مشاهده است.

far9090
شنبه 16 آبان 1388, 10:40 صبح
چون با استفاده از نوع تاریخ سیستم تبدیل رو انجام میده . وقتی تاریختون قمری هستش نوع تبدیل قمری به شمسیه و در حالت میلادی تبدیل تاریخ از میلادی به شمسی انجام می گیره . وفتی در حالت قمری سیستمتون قرار داره باید تاریخ رو قمری وارد کنید تا درست به سال 88 تبدیل بشه . موفق باشید .

hamidprogramer
شنبه 16 آبان 1388, 15:02 عصر
اگر اين طوري كه شما مي فرماييد باشه خيلي خطاها در محاسبات پيش مي آيد!
ببينيد من كلاس پرشين رو ايجاد كردم و تاريخ ميلادي رو بطور مستقيم به عنوان ارگومان به تابع دادم چرا بايد عمليات تبديل بر اساس تقويم ويندوز انجام بشه.

mn_zandy63
یک شنبه 17 آبان 1388, 17:35 عصر
سلام دوست من، مشکل از تابع GetYear نیست، مشکل از DateTime.Parse هست.

شما که هیچ جا براش تعیین نکردید تاریخی که دارید میدید میلادی هست نه مثلا قمری. بنابراین این تابع بر اساس تقویم سیستمتون ورودی رو میخونه و تبدیل میکنه.
برای اینکه تعیین کنید که ورودیتون میلادی هست میتونید به این شکل عمل کنید:

System.Globalization.PersianCalendar Pc = new System.Globalization.PersianCalendar();
var enCulture = new System.Globalization.CultureInfo("en-us", true);
Label1.Text = Pc.GetYear(DateTime.Parse("2009/11/08", enCulture)).ToString();

hamidprogramer
دوشنبه 18 آبان 1388, 12:57 عصر
سلام
طبق گفته شما بايد تابع زير خروجي ميلادي رو در حالتي كه تقويم ويندوز قمري باشه ارائه بده ولي اينطور نيست؟!!!!

class MyDateClass
{
private PersianCalendar Pc = new PersianCalendar();
private HijriCalendar Hc = new HijriCalendar();
private CultureInfo CI = new CultureInfo("en-US", true);

/*----------------------------------------------------------------------------*/
public DateTime GetCurrentGr_Date()
{
string Gr_date =
string.Format("{0:0000}/{1:00}/{2:00}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
return DateTime.Parse(Gr_date,CI);
}
/*----------------------------------------------------------------------------*/
}

far9090
دوشنبه 18 آبان 1388, 13:21 عصر
من یک dll براتون میزارم . از این استفاده کنید .

hamidprogramer
دوشنبه 18 آبان 1388, 15:29 عصر
با تشكر از لطف شما، من جواب سوال خودم رو ميخوام نه فايل دي ال ال شما رو . ممنون

mustafa13
دوشنبه 18 آبان 1388, 21:14 عصر
سلام
دوست عزيز ممكن نبود كه شما چك مي كرديد مي ديد تاريخ سيستم ميلادي شمسي يا قمري بد كار تبديل را انجام مي دادي بهتر نبود اين كارو مي كرديد

mn_zandy63
سه شنبه 19 آبان 1388, 22:32 عصر
سلام
طبق گفته شما بايد تابع زير خروجي ميلادي رو در حالتي كه تقويم ويندوز قمري باشه ارائه بده ولي اينطور نيست؟!!!!

class MyDateClass
{
private PersianCalendar Pc = new PersianCalendar();
private HijriCalendar Hc = new HijriCalendar();
private CultureInfo CI = new CultureInfo("en-US", true);

/*----------------------------------------------------------------------------*/
public DateTime GetCurrentGr_Date()
{
string Gr_date =
string.Format("{0:0000}/{1:00}/{2:00}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
return DateTime.Parse(Gr_date,CI);
}
/*----------------------------------------------------------------------------*/
}

سلام دوست من،
همونطور که بهت گفتم، با اون روش، ورودیت درست خونده میشه. حتما تست کردی و دیدی که درست تبدیل میکنه.
میتونی از تغیر DateTime که return کردی، property های Year و Month و Day رو نگاه کنی میبینی که سال و ماه و روز میلادی هست.
اما وقتی که DateTime رو به String تبدیل کنی، (وقتی که با ماوس میری روش و یک رشته بهت میده) از Control Panel ویندوز فرمت نمایش تاریخ رو میگیره، بنابراین تاریخ قمری مرتبط رو نشون میده، اما اطلاعات درست تبدیل شده.

موفق باشی

mn_zandy63
سه شنبه 19 آبان 1388, 22:37 عصر
یک توضیح دیگه بدم،
اگه خواستی خروجی ToString از شی DateTime به جای فرمت قمری به صورت میلادی باشه، نباید از yourdatetimeobject.ToString()
استفاده کنی بلکه باید مثل تابع Parse نوع فرمت رو به عنوان ورودی بهش بدی، به عنوان مثال در کد شما که CI فرمت میلادی هست، باید از تابع زیر استفاده کنی:yourdatetimeobject.ToString(CI);

موفق باشی