PDA

View Full Version : سوال: اعتبار سنجی تاریخ در C#



Ahmad765
سه شنبه 09 آبان 1391, 08:49 صبح
سلام.

لطفا دوستان روش های پیشنهادی خودشون رو برای اعتبارسنجی تاریخ بیان کنند.
مثلا تاریخ ورودی کاربر 91/7/31 یا 91/12/30 یا 91/12/31 یا 91/12/29

پیشاپیش ممنونم

Nima_kyan
سه شنبه 09 آبان 1391, 09:14 صبح
راه های زیادی واسه اینکار وجود داره.
شما میتونین از کامپوننت استفاده کنید اگه تو همین سایت هم سرچ کنی از این قبیل کامپوننت ها هست.(البته از کامپوننت های مطمئن باید استفاده کرد :چشمک:)
و یا از MaskedTextBox خود سی شارپ استفاده و با کدنویسی اعتبارسنجیش رو انجام بدی.

مهدی هادیان2
سه شنبه 09 آبان 1391, 10:01 صبح
بسم الله الرحمن الرحيم با سلام تکه کدي نوشتم اميدوارم به کارتون بياد: public bool Checkdate(string PersianDate) { // if (PersianDate == &quot;13 / / &quot;) { try { PersianDate = PersianDate.Replace(&quot; &quot;, &quot;&quot;); year = int.Parse(PersianDate.Substring(0, PersianDate.IndexOf('/'))); month = int.Parse(PersianDate.Substring(PersianDate.IndexO f('/') + 1, 2)); day = int.Parse(PersianDate.Substring(PersianDate.LastIn dexOf('/') + 1, 2)); hour = 0; minute = 0; second = 0; /* try { hour = int.Parse(PersianDate.Substring(10, 2)); minute = int.Parse(PersianDate.Substring(13, 2)); second = int.Parse(PersianDate.Substring(16, 2)); }*/ } catch { message = &quot;فرمت تاریخ اشتباه است&quot;; doneSafeLastOp = false; return false; } if (month > 12 || month < 01) { message = &quot;ماه اشتباه است&quot;; doneSafeLastOp = false; return false; } if (day > 31 || day < 01) { message = &quot; روز اشتباه است&quot;; doneSafeLastOp = false; return false; } /// ///Year is not Leap. /// System.Globalization.PersianCalendar PCalendar = new System.Globalization.PersianCalendar(); if (!PCalendar.IsLeapYear(year)) { if (month==12 && day >= 30) { message = &quot; روز اشتباه است&quot;; doneSafeLastOp = false; return false; } } /// ///Year is Leap. /// if (PCalendar.IsLeapYear(year)) { if (month == 12 && day > 30) { message = &quot; روز اشتباه است&quot;; doneSafeLastOp = false; return false; } } if (hour > 24 || hour < 00 || minute > 60 || minute < 00 || second > 60 || second < 00) { message = &quot;زمان اشتباه است&quot;; doneSafeLastOp = false; return false; } if (((month >= 1 && month = 1 && day = 7 && month = 1 && day با عرض پوزش از درهم ريختگي کدها, نمي دونم چرا تگ هاي کد و غيره کار نميکنند. موفق باشيد

Ahmad765
سه شنبه 09 آبان 1391, 11:32 صبح
ممنونم.

متاسفانه هنوز کد رو نتونستم بخونم که چکش کنم.


البته به نظر بنده استفاده از maskedtextbox کمکی نمیکنه.
باید بشه خود تاریخ رو بصورت مطمئن validate کرد.

arefba
سه شنبه 09 آبان 1391, 13:28 عصر
تاریخ رشته ای رو به datetime تبدیل کنید در صورت اشتباه بودن تبدیل نخواهد شد

mehrdad372
سه شنبه 09 آبان 1391, 13:30 عصر
میتونی از توابع رشته ای هم استفاده کنی

hakim22
سه شنبه 09 آبان 1391, 19:18 عصر
بهترین راه تبدیل تاریخ به میلادی و بررسی اینه که تاریخ میلادیش وجود داره یا نه.
از PersianCalendar میتونید استفاده کنید .

programerinfonet
سه شنبه 09 آبان 1391, 19:46 عصر
از کلاس persian calender کمک بگیر
تاریخ اشتباه رو بر نمی گردونه

Ahmad765
سه شنبه 09 آبان 1391, 20:40 عصر
از تمام دوستان بسیار ممنونم.

امکانش هست یک مثال هم بزنید ؟ تابع رشته ای رو نمیدونم چیه ... اگر میشه راهنمایی کنید. persian calender ؟

نمیدونم این مشکل رو شما هم دارید یا فقط از من هست. صفحات سایت بسختی لود میشه.
حتی نتونستم تشکر کنم.

programerinfonet
سه شنبه 09 آبان 1391, 21:15 عصر
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
بله دوست عزیز ظاهرأ حجم بازدیدکنندگان بالا رفته سرور توانایی رو نداره
کم آورده

Ahmad765
سه شنبه 09 آبان 1391, 21:54 عصر
ممنونم از پاسخ.

آیا همچین چیزی درسته.


PersianCalendar pc = new PersianCalendar();
DateTime dt = pc.ToDateTime(1391, 12, 30,10,0,0,0);
MessageBox.Show(dt.ToString());

تو تاریخ خاصی خطا نداره ؟

اگر تاریخ بصورت
1391/12/30
باشه آیا خطایی در تبدیل به تاریخ میلادی نداره؟
باید حتما اسپلیت بشه یا مستقیم میشه تبدیلش کرد ؟

Ahmad765
سه شنبه 09 آبان 1391, 22:06 عصر
کد اول که در زیر نوشتم بصورت صحیح جواب میده. آیا مشکلی نداره؟

اما کد دوم رو نمیدونم چطوری باید بصورت صحیح به شمسی تبدیل کنم و اعتبار سنجی کنم.

try
{
PersianCalendar pc = new PersianCalendar();
DateTime dt = pc.ToDateTime(1391, 12, 31,10,0,0,0);
MessageBox.Show(dt.ToString());
}catch
{
MessageBox.Show("لطفا تاریخ را بصورت صحیح وارد نمایید");
}


string perDate = "1391/12/30";
DateTime dt2 = Convert.ToDateTime(perDate);
MessageBox.Show(dt2.ToString());

MMR_1344
سه شنبه 09 آبان 1391, 22:53 عصر
برای اعتبار سنجی میتونی یک سال کبیسه رو به عنوان سال مبنا در نظر بگیری و به اون چهار سال چهار سال اضافه کنی اگر سال مورد نظر با اون برابری کرد اون سال کبیسه هست و اسفند ماه 30 روز میشه اگه نبود اسفند 29 روزه خواهد بود

برای ماهای دیگه که مشکلی وجود نداره شش ماهه اول 31 روزه و ژنج ماه دوم 30 روزه هست که اگر تاریخی خارج از اون از طرف مجری برنامه وارد شد میتونی به اون پیغام اشتباه بودن رو بدی

Ahmad765
دوشنبه 15 آبان 1391, 11:25 صبح
سلام.

با توجه به فرمول محاسبه سال کبیسه فکر نمیکنم این راه درستی باشه.
ولی به نظرم درست ترین راه تبدیل تاریخ به میلادی و validate کردن اون هست.

منتها از دوستان تقاضا میکنم در صورت امکان راه حل مورد استفاده خودشون رو بصورت کد قرار بدهند تا بتوان نقاط ضعف و قوت اونها رو بررسی کرد تا برنامه دچار باگ نشه.

ممنون از همه.

shaho.khedri
سه شنبه 06 آذر 1397, 11:05 صبح
سلام از این پست زمان زیادی گدشته. دوستانی که هنوز به جواب آماده ای دسترسی ندارند:
private bool isDateInCorrectFormat(string date) {

try
{
int year, month, day;
year = int.Parse(date.Trim().Split('/')[0]);
month = int.Parse(date.Trim().Split('/')[1]);
day = int.Parse(date.Trim().Split('/')[2]);
DateTime dateTime = new DateTime(year, month, day, new PersianCalendar());
return true;
}
catch {
return false;
}
}
فرض گرفتیم تاریخ به صورت "روز/ماه/سال" به این متد داده بشه