PDA

View Full Version : خطا در تبدیل رشته به datetime



aliwmhmdi
جمعه 10 خرداد 1398, 01:00 صبح
درود و خسته نباشید
دارم برنامه ای مینویسم تحت عنوان مدیریت یک هتل (به عنوان نمونه) در ویندوز فرم سی شارپ و پروسیجر ها و تیبل های اس کیو ال


تو فرم پذیرش مسافر جدید من برای قسمت شروع اقامت مسافر جدید ماسک تکست باکسی گذاشتم که فقط فرمت ####/##/## باید توش فیل بشه و در غیر این صورت به کاربر ارور میده که تاریخ رو اشتباه نوشته و درستش کنه پس یعنی ما اصلا تاریخ اشتباهی نداریم و همه تاریخ هامون کاملا صحیح توی دیتابیس ثبت میشن


برای مثال پذیرشی انجام میدیم از با شروع اقامت 1398/03/02 و اتاقی رو انتخاب میکنیم که کرایش روزی 1000 تومنه
در قسمت پذیرش شده های هتل، برای این کاربر اتمام پذیرش رو در 1398/03/09 میزنیم یعنی اون مسافر به مدت 7 روز توی هتل مونده و باید نرم افزار مبلغ 7000 تومن رو ازش بخواد....خب تا اینجای کار درسته و هیچ مشکلی نداریم یعنی تمام قسمت ها بدرستی انجام میشه


من تست کردم و دیدم برای مثال اگر تاریخ های 1398/02/31 یا 1398/02/29 یا 1398/02/30 رو وارد کنم و اتمام پذیرش رو بزنم کد برنامم ارور میده و میگه نوع تاریخ اشتباهه
-------------------------------------------------------------------------------------------
کد قسمت حساب کردن کرایه به این شکل هست:





PersianCalendar pc = new PersianCalendar();
string strDate = pc.GetYear(DateTime.Now).ToString("0000") + "/" + pc.GetMonth(DateTime.Today).ToString("00") + "/" + pc.GetDayOfMonth(DateTime.Now).ToString("00");


DateTime dt1;
DateTime dt2;


dt1 = Convert.ToDateTime(strDate);
dt2 = Convert.ToDateTime(txtBDate.Text);


int Distance = Convert.ToInt32((dt1 - dt2).TotalDays.ToString());


که بعد از این قسمت با پروسیجر و دیتابیس کار میکنم که مشکلی نداره کدها و فقط این قسمت مشکل داره و مطمئنم از همین قسمته


-----------------------------------------------------------------------------------------------------------------


که به درستی برای همه تاریخ ها کار میکنه به جز روز های 29 و 30 و 31 و خب طبیعتا در تاریخی مثل 1398/02/00 هم که باید ارور بده و طبیعیه اما دلیل ارور های روز های 29و30و31 رو نمیدونم
ممنون میشم کمکم کنید


-------------------------------------------------------------------------------------------------------------------


اروری که برای اون روز ها میده هم اینه:





{"String was not recognized as a valid DateTime."}

و این ارور رو روی این خط کد میده:



dt2 = Convert.ToDateTime(txtBDate.Text);



که تاریخ شروع اقامت مسافر هست


لطفا اگه کسی مشکل رو میدونه جواب بده

Mahmoud.Afrad
شنبه 11 خرداد 1398, 04:04 صبح
نوع datetime مخصوص تاریخ میلادی هست و نباید تاریخ شمسی درش ذخیره کنید. پس باید به طریقی به میلادی تبدیل کنید.
از متد زیر استفاده کنید. در صورتی که تاریخ شمسی معتبر باشد به میلادی تبدیل میکند.
private bool ValidatePersianDate(string strInput, out DateTime dtResult)
{
return DateTime.TryParse(
strInput,
CultureInfo.CreateSpecificCulture("fa-ir"),
DateTimeStyles.AssumeLocal,
out dtResult);
}
کدتون رو به شکل زیر تغیرر بدید
DateTime dt1 = DateTime.Today;
DateTime dt2;
bool isValid = ValidatePersianDate(txtBDate.Text, out dt2);
if (isValid)
{
int totalDays = (int) (dt1 - dt2).TotalDays;
// ...
}