این تابع یک رشتهی با فرمت مشخص را به تاریخ و زمان تبدیل میکند. دو overload این تابع را در زیر میبینیم:
Value : رشتهای از تاریخ و زمان میباشد.
Value : رشتهای از تاریخ و زمان میباشد.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Value : رشتهای از تاریخ و زمان میباشد.
اگر مقدار رشته تهی باشد، استثنای Null نمایش داده خواهد شد (ArgumentNullException ) و اگر فرمت تاریخ ورودی صحیح نباشد، با استثنای فرمت غیرمعتبر روبرو خواهیم شد (FormatException).
string datestr = null;
Console.WriteLine(DateTime.Parse(datestr));
//// Exception: Argument null exception
datestr = "wrong string";
Console.WriteLine(DateTime.Parse(datestr));
//// Exception: The string was not recognized as a valid DateTime.
//// There is an unknown word starting at index 0.
datestr = "Tue Dec 30, 2015";
//Unhandled Exception: System.FormatException:
//String was not recognized as a valid DateTime.
Console.WriteLine(DateTime.Parse(datestr));
تابع ()DateTime.ParsExact
این تابع رشتهای شامل تاریخ و زمان را بههمراه فرهنگ ارسالی، دریافت و آن را تبدیل به نوع DateTime میکند. فرمت رشتهی ارسالی باید با فرمت استاندارد رشتهی تاریخ یکسان باشد. overloadهای مختلف این تابع را در زیر مشاهده میکنید:
• DateTime.ParseExact(string value, string format, IFormatProvider provider)
Value : رشتهای از تاریخ و زمان میباشد.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
• DateTime.ParseExact(string value, string format, IFormatProvider provider, DateTimeStyles style)
Value : رشتهای از تاریخ و زمان میباشد.
Format : فرمت مورد نظر برای نمایش تاریخ بعد از تبدیل را مشخص میکند.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Styles : از طریق این پارامتر تنظیمات قالب بندی رشته برای سفارشی کردن عملیات جداسازی و پردازش تعریف میشود.
• DateTime.ParseExact(string value, string[] formats, IFormatProvider provider, DateTimeStyles style)
Value : رشتهای از تاریخ و زمان میباشد.
Format : فرمت مورد نظر برای نمایش تاریخ بعد از تبدیل را مشخص میکند. تفاوت این حالت با حالت قبل این است که لیستی از فرمتها را قبول میکند و حداقل باید یک فرمت با رشتهی ارسالی قابل انطباق باشد.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Styles : از طریق این پارامتر تنظیمات قالب بندی رشته برای سفارشی کردن عملیات جداسازی تعریف میشود.
اگر مقدار رشته تهی باشد، استثنای Null نمایش داده خواهد شد (ArgumentNullException) و اگر فرمت تاریخ ورودی صحیح نباشد، با استثنای فرمت غیرمعتبر روبرو خواهیم شد(FormatException).
فرمت رشتهی تاریخ حتما باید با فرمت نوع تاریخ منطبق باشد. به همین منظور حالتهای مختلفی را در آرایه میتوان پیش بینی کرد. بطور مثال ممکن است رشتهی ما بصورت "2012-2-1" و یا "2012/2/1" باشد. بنابر این فرمتهای "MM/dd/yyyy" و "MM-dd-yyyy" را از طریق آرایه ارسال میکنیم.
برای درک بهتر این موضوع، کدهای زیر را مشاهده کنید:
string datestr = null;
CultureInfo provider = CultureInfo.InvariantCulture;
Console.WriteLine(DateTime.ParseExact(datestr, "mm/dd/yyyy", provider));
//Unhandled Exception: System.ArgumentNullException:
//String reference not set to an instance of a String.
datestr = "wrong date";
Console.WriteLine(DateTime.ParseExact(datestr, "mm/dd/yyyy", provider));
//Unhandled Exception: System.FormatException:
//String was not recognized as a valid DateTime
datestr = "Tue Dec 30, 2015";
Console.WriteLine(DateTime.ParseExact(datestr, "mm/dd/yyyy", provider));
//Unhandled Exception: System.FormatException:
//String was not recognized as a valid DateTime.
datestr = "10-22-2015";
Console.WriteLine(DateTime.ParseExact(datestr, "MM-dd-yyyy", provider));
//30/07/1394 12:00:00 ق.ظ
datestr = "10-22-2015";
Console.WriteLine(DateTime.ParseExact(datestr, new string[]
{"MM-dd-yyyy", "MM/dd/yyyy", "MM.dd.yyyy"}, provider, DateTimeStyles.None));
//30/07/1394 12:00:00 ق.ظ
تابع ()DateTime.TryParse
این تابع رشتهای شامل تاریخ و زمان را بههمراه فرهنگ مشخصی، دریافت و آن را تبدیل به نوع DateTime میکند و یک مقدار bool را برای اعلان این موضوع که عملیات تبدیل با موفقیت انجام شده است یا خیر، باز میگرداند. فرمت رشتهی ارسالی باید با فرمت رشتهی تاریخ یکسان باشد. overloadهای مختلف این تابع را در زیر مشاهده میکنید:
• DateTime.TryParse (String value, out DateTime result)
Value : رشتهای از تاریخ و زمان میباشد.
Result : مقدار تاریخ را بعد از جداسازی در خود ذخیره میکند.
• DateTime.TryParse(String value, IFormatProvider provider, DateTimeStyles styles, out DateTime result)
Value : رشتهای از تاریخ و زمان میباشد.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Styles : از طریق این پارامتر میتوانیم قالب پارامتر ارسالی را مشخص کنیم (مثلا نادیده گرفتن فضاهای خالی).
Result : مقدار تاریخ را بعد از جداسازی در خود ذخیره میکند.
این تابع همیشه سعی میکند رشتهی تاریخ را جداسازی کند. در صورت موفقیت در عملیات جداسازی رشته، تاریخ معتبر را بر میگرداند و در غیر اینصورت میزان کوچکترین تاریخ یا همان MinValue را که قبلا در همین مطلب اشاره شد، باز میگرداند. در صورتی هم که رشته، null یا با فرمت رشتهای غیر معتبر باشد، همان مقدار DateTime.MinValue بازگردانده میشود. همیشه با کنترل مقدار بازگشتی صحت انجام عملیات را میتوان متوجه شد (true موفقیت در عملیات جداسازی و false عدم موفقیت در عملیات جداسازی).
نکتهی مهم عدم پرتاب استثتاء در صورت عدم موفقیت در عملیات جداسازی میباشد.
string datestr = null;
DateTime temp;
Console.WriteLine(DateTime.TryParse(datestr, out temp));
Console.WriteLine(temp);
//False
//0001 - 01 - 01T00: 00:00
datestr = "wrong date";
Console.WriteLine(DateTime.TryParse(datestr, out temp));
Console.WriteLine(temp);
//False
//0001 - 01 - 01T00: 00:00
datestr = "Tue Dec 30, 2015";
Console.WriteLine(DateTime.TryParse(datestr, out temp));
Console.WriteLine(temp);
//False
//0001 - 01 - 01T00: 00:00
تابع ()DateTime.TryParseExact
این تابع رشتهای شامل تاریخ و زمان را بههمراه فرهنگ مشخصی دریافت و آن را تبدیل به نوع DateTime میکند. رشتهی ارسالی باید منطبق با فرمت تاریخ باشد. overloadهای مختلف این تابع را در زیر مشاهده میکنید:
• DateTime.ParseExact(string value, string format, IFormatProvider provider, DateTimeStyles style)
Value : رشتهای از تاریخ و زمان میباشد.
Format : فرمت مورد نظر را برای نمایش تاریخ بعد از تبدیل، مشخص میکند.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Styles : از طریق این پارامتر میتوانیم قالب پارامتر ارسالی را مشخص کنیم (مثلا نادیده گرفتن فضاهای خالی).
• DateTime.ParseExact(string value, string[] formats, IFormatProvider provider, DateTimeStyles style)
Value : رشتهای از تاریخ و زمان میباشد.
Format : فرمت مورد نظر برای نمایش تاریخ بعد از تبدیل را مشخص میکند و میتوان آرایهای از فرمتها را در اینجا ارسال کرد.
Provider : اطلاعات فرهنگ مورد نظر را فراهم میکند.
Styles : از طریق این پارامتر میتوانیم قالب پارامتر ارسالی را مشخص کنیم (مثلا نادیده گرفتن فضاهای خالی).
این تابع را در شرایط زیر، مقدار (MinValue( 1/1/0001 12:00:00 AM را باز میگرداند:
• رشته null باشد.
• رشته خالی باشد "".
• فرمت رشتهی تاریخ غلط باشد.
• رشته با فرمت معرفی شدهی در provider، انطباق نداشته باشد.
• تنها در صورتی که مقدار انتخابی DateTimeStyle معتبر نباشد، استثنایی رخ میدهد.
همچنین همیشه پس از انجام عملیات، مقداری بولین را برای نمایش موفقیت یا عدم موفقیت جدا سازی، باز میگرداند.
string datestr = null;
DateTime temp;
CultureInfo provider = CultureInfo.InvariantCulture;
Console.WriteLine(DateTime.TryParseExact(datestr, "MM/dd/yyyy", provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//False
//1/1/0001 12:00:00 AM
datestr = "wrong date";
Console.WriteLine(DateTime.TryParseExact(datestr, "MM/dd/yyyy", provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//False
//1/1/0001 12:00:00 AM
datestr = "Tue Dec 30, 2015";
Console.WriteLine(DateTime.TryParseExact(datestr, "MM/dd/yyyy", provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//False
//1/1/0001 12:00:00 AM
datestr = "10‐22‐2015";
Console.WriteLine(DateTime.TryParseExact(datestr, "MM/dd/yyyy", provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//False
//1/1/0001 12:00:00 AM
datestr = "10‐22‐2015";
Console.WriteLine(DateTime.TryParseExact(
datestr, "MM‐dd‐yyyy", provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//True
//30/07/1394 12:00:00 ق.ظ
datestr = "10‐12‐2015";
Console.WriteLine(DateTime.TryParseExact(datestr, new string[] { "MM/dd/yyyy", "MM‐dd‐yyyy", "MM.dd.yyyy" }, provider, DateTimeStyles.None, out temp));
Console.WriteLine(temp);
//True
//20/07/1394 12:00:00 ق.ظ
آنالیز متدهای معرفی شده
نوع DateTime متدهای مختلفی را برای جداسازی رشته و تبدیل آن به تاریخ دارد. تفاوتهای این متدها را در بخش زیر بررسی میکنیم :
تفاوت Parse و ConvertToDateTime:
این دو متد شبیه به هم هستند، اما چند تفاوت کوچک با هم دارند:
• اگر مقدار رشتهی ارسالی null باشد، متد Parse، یک استثناء را ارسال میکند و متد ConvertToDateTime مقدار MinValue را باز میگرداند.
• در متد Parse میتوان یک پارامتر اضافهتر نیز ارسال کرد که DateTimeStyle نامیده میشود. اما متد ConvertToDateTime این قابلیت را ندارد.
• تابع ConvertToDateTime بهصورت داخلی از متد DateTime.Parse بههمراه فرهنگ جاری استفاده میکند.
تفاوت تابع Parseو ParseExact:
این دو تابع شبیه به هم هستند، اما میتوان یک پارامتر اضافی format را نیز به تابع ParseExact ارسال کرد. این پارامتر به ما کمک میکند تا رشتهای را که فرمت متفاوتی از حالت معمولی دارد، به تاریخ تبدیل کنیم. مثلا اگر رشتهی "11232015" بدین شکل باشد، فرمت باید به شکل "MMddyyyy" تعریف شود.
تفاوت تابع Parse و TryParse:
این دو متد شبیه به هم هستند، با این تفاوت که تابع TryParse در صورت عدم موفقیت جداسازی رشته، استثنائی را ارسال نمیکند و همیشه مقدار MinValue را در صورت عدم موفقیت در تبدیل، باز میگرداند.
تفاوت تابع TryParse و TryParseExact:
هر دو تابع شبیه به هم هستند؛ بجز در پارامتر format. تابع TryParseExact از یک پارامتر اضافهی format استفاده میکند. ولی تابع TryParse اگر نتواند فرمت مورد نیاز را فراهم کند، مقدار minValue را باز میگرداند.