مستر کد
mrcode.wikibix.ir

متغیر تاریخ در سی شارپ

نویسنده : نازنین رحمانی | زمان انتشار : 07 مهر 1400 ساعت 12:02

جهت انجام پروژه های دانشجویی و یا تمرین‌های برنامه نویسی رشته کامپیوتر میتوانید به آی دی تلگرام زیر پیام دهید

@AlirezaSepand



سی شارپ برای کار با تاریخ و زمان؛ ساختار شگفت انگیزی دارد که DateTime نام دارد. این ساختار در واقع نوعی داده نیست؛ اما ما آن را در این فصل قرار داده ایم، زیرا اغلب هنگام برنامه نویسی ناچار هستید که با استفاده از ساختار DateTime با تاریخ و/یا زمان کار بکنید، به ویژه زمانی که در حال کار با رشته ها و اعداد هستید.

بیایید با نمونه سازی یک شیء DateTime جدید آغاز کنیم:

DateTime dt = new DateTime();
Console.WriteLine(dt.ToString());

نتیجه ممکن است تا حدودی خسته کننده باشد: ۰۱-۰۱-۰۰۰۱ ۰۰:۰۰:۰۰ . این نتیجه به فیلد DateTime.MinValue مربوط می شود؛ اما DateTime ویژگی های کمک کننده ی بیشتری دارد – جالب ترین آنها DateTime: می باشد. اکنون:

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString());

به این ترتیب تاریخ و زمان جاری برای ما نمایش داده می شود – که غالباً بسیار مهم است- در برخی از مثال های آینده، این موضوع را خواهیم دید. با این حال، در بسیاری از مواقع شما به دنبال نمایش یک تاریخ و زمان خاص هستید – خوشبختانه برای ما ، DateTime دارای چندین سازنده است که فقط در این زمینه به ما کمک می کند. در ادامه مثالی آورده ایم:

DateTime dt = new DateTime(2042, 12, 24);
Console.WriteLine(dt.ToString());

ترتیب پارامترهای موجود در این سازنده سال، ماه و روز است. بنابراین این کد نویسی به ما یک شیء DateTime ارائه می دهد که نشان دهنده تاریخ شب کریسمس در سال ۲۰۴۲ می باشد.

DateTime- با زمان یا بدون زمان

اما در مورد ارائه ی زمان چگونه است؟ اگر شما زمان را مشخص نکرده باشید؛ همان طور که در مثال قبلی می بینید؛ به طور پیش فرض زمان روی ۰۰:۰۰:۰۰ می باشد. البته به سادگی می توانید زمان را نیز مشخص کنید:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
Console.WriteLine(dt.ToString());

اکنون ساختار DateTime یک زمان نیز دارد؛ در این مورد زمان ۱۸:۴۲ می باشد. توجه کنید که ساعت باید به صورت عددی مشخص شود که بین ۰ تا ۲۳ می باشد؛ چرا که ما از نوع ۲۴ ساعته ی زمان برای ورودی استفاده می کنیم. اما اگر می خواهید از یک نوع ساعت ۱۲ ساعته قبل/بعد از ظهر (AM/PM) استفاده کنید؛ نیز نگرانی نداشته باشید – همان طور که در ادامه خواهیم گفت؛ این کار را می توانید به راحتی انجام دهید.

سؤال باقی مانده این است که: اگر فقط قسمت تاریخ را بخواهید؛ چه باید بکنید؟ پاسخ روشن این سؤال آن است که به جای کلاس DateTime باید از کلاس Date استفاده کنید؛ اما در واقع چنین چیزی وجود ندارد؛ در عوض کلاس DateTime یک ویژگی Date دارد:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
DateTime date = dt.Date;
Console.WriteLine(date.ToString());

همانطور که خواهید دید ، ویژگی Date نیز یک شیء DateTime است، که در آن قسمت زمان روی ۰۰:۰۰:۰۰ تنظیم شده است. این ممکن است کمی گیج کننده باشد، اما بدانید که DateTime همیشه باید فقط به عنوان یک نگهدارنده عمل کند، داده هایی را نگه می دارد که می توانید آنها را به طرق و شکل های مختلف به کاربر منتقل کنید. ما قبلاً از متد پایه ای ()ToString استفاده کرده ایم ، اما روش های بسیار بیشتری برای بدست آوردن خروجی یک شیء DateTime وجود دارد.

خروجی DateTime

دریافت خروجی از DateTime یکی از مهمترین جنبه ها است، اما در عین حال می تواند یک کار پیچیده باشد – درواقع به نیازهای شما بستگی دارد. تاکنون نسخه بسیار پایه ای خروجی را مشاهده کرده ایم که فراخوانی ساده متد ()ToString می باشد. این متد؛ تاریخ و زمان را بر اساس تقویم فعلی برنامه در خروجی به نمایش می گذارد. تقویم نیز به طور پیش فرض، بر اساس تنظیمات سیستم انجام می شود. این بدان معناست که اگر شما فقط متد ()ToString را فراخوانی کنید، تاریخ و زمان به روشی ارائه می شود که برای آنها منطقی باشد در هر کجای دنیا مهم نیست، زیرا همانطور که احتمالاً می دانید فرمت زمان و به خصوص تاریخ تا حد زیادی از منطقه به منطقه دیگر متفاوت است.

اگر به دنبال آن هستید که کنترل بیشتری روی خروجی داشته باشید؛ روش های زیادی برای این کار وجود دارد. سریع ترین راه استفاده از یکی از متدهای To*؛ مثلاً متد ()ToShortDateString می باشد.

Console.WriteLine(DateTime.Now.ToShortDateString());

این کد؛ نسخه کوتاهی از تاریخ را نشان می دهد؛ در حالی که بخش زمان به طور کامل حذف شده است. شما می توانید از متد ()ToLongDateString استفاده کنید:

Console.WriteLine(DateTime.Now.ToLongDateString());

بسته به تنظیمات منطقه، خروجی متغیر خواهد بود ، اما معمولاً یک تاریخ طولانی به جای نمایش عددی در خروجی ظاهر می شود که ماه به جای عدد؛ صورت متن نشان داده می شود.

اگر به دنبال کنترل بیشتری هستید و می خواهید اطلاعات تاریخ / زمان خود را با یک منطقه خاص تطبیق دهید، می توانید از یکی از اورلودهای روش ()ToString استفاده کنید؛ و مشخص کنید که دقیقاً کدام فرهنگ / منطقه را هدف قرار می دهید:

var usCulture = new System.Globalization.CultureInfo(“en-US”);
Console.WriteLine(DateTime.Now.ToString(usCulture.DateTimeFormat));

کلاس CultureInfo به شما اجازه می دهد یک سری اطلاعات کامل درمورد یک زبان دریافت کنید؛ بدانید که چگونه تاریخ و زمان را می نویسند (کلاس CultureInfo در ادامه مطرح می شود). ما می توانیم سپس؛ این اطلاعات را به کلاس DateTime منتقل کنیم؛ تا این کلاس را متوجه کنیم که می خواهیم یک نمایش بصری از تاریخ و زمان داشته باشیم که با این زبان مطابقت داشته باشد. اما اگر بخواهیم خروجی را حتی به صورت ویژه تری در آوریم؛ چه می شود؟

رشته های فرمت استاندارد تاریخ و زمان

برای آن که بتوانیم بازهم کنترل بیشتری روی خروجی داشته باشیم؛ می توانیم از رشته های فرمت استاندارد تاریخ و زمان استفاده کنیم که توسط چارچوب دات نت فراهم شده است. در ادامه مشاهده می کنید که این رشته ها برای نشان دادن روشی استفاده شده است که تاریخ و/یا زمان را نمایش می دهند. برای این که به لیست کامل دسترسی پیدا کنید؛ پیشنهاد می کنیم که نگاهی به  documentation بیندازید؛ اما اکنون به مثال زیر بپردازیم:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);

Console.WriteLine(“Short date pattern (d): ” + dt.ToString(“d”));
Console.WriteLine(“Long date pattern (D): ” + dt.ToString(“D”));
Console.WriteLine(“Full date/time pattern (F): ” + dt.ToString(“F”));
Console.WriteLine(“Year/month pattern (y): ” + dt.ToString(“y”));

خروجی به شکل زیر می باشد:

Short date pattern (d): 24-12-2042
Long date pattern (D):  ۲۴٫ december 2042
Full date/time pattern (F):     ۲۴٫ december 2042 18:42:00
Year/month pattern (y): december 2042

به این ترتیب می توانید کنترل بیشتری روی خروجی داشته باشید؛ اما گاهی اوقات این کنترل کافی نیست؛ در آن موارد؛ باید یک رشته با فرمت سفارشی و خاص داشته باشیم.

رشته های با فرمت خاص برای زمان و تاریخ

برای کنترل کامل، ما رشته هایی با فرمت خاص داریم. آنها ترکیبی از حروف و کاراکترهای خاصی هستند که شما به متد ()ToString منتقل می کنید؛ تا آن فرمت واقعی را که می خواهید برای تاریخ و / یا زمان به کار ببرید؛ نشان داده شود. این کنترل می تواند به شما کمک کند که یکی از بخش های تاریخ و/یا زمان را انتخاب کنید. می توانید انتخاب کنید که به چه صورت نشان داده شوند. واضح است که در این حالت؛ گزینه های زیادی برای انتخاب دارید. بنابراین؛ برای لیست کاملی از مشخصات فرمت های موجود، لطفاً documentation را بررسی کنید. اما بیاید ببینیم این متد چگونه کار می کند.

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);

Console.WriteLine(dt.ToString(“MM’/’dd yyyy”));
Console.WriteLine(dt.ToString(“dd.MM.yyyy”));
Console.WriteLine(dt.ToString(“MM.dd.yyyy HH:mm”));
Console.WriteLine(dt.ToString(“dddd, MMMM (yyyy): HH:mm:ss”));
Console.WriteLine(dt.ToString(“dddd @ hh:mm tt”, System.Globalization.CultureInfo.InvariantCulture));

خروجی به شکل زیر خواهد بود:

۱۲/۲۴ ۲۰۴۲
۲۴٫۱۲٫۲۰۴۲
۱۲٫۲۴٫۲۰۴۲ ۱۸:۴۲
onsdag, december (2042): 18:42:00
Wednesday @ 06:42 PM

در کل، یک یا چند d  نسخه هایی از روز را در اختیار شما قرار می دهد؛ یک یا چند M ماه را در اختیارتان می گذارد (m کوچک برای نشان دادن دقیقه است) و تعدادی از y سال را در اختیارشما می گذارد. برای درک کامل از آنچه مشخصه های فرمت ها انجام می دهند؛ پیشنهاد می کنیم که نگاهی به  documentation بیندازید؛ اما خوشبختانه؛ مثال بالا ایده ی خوبی به شما می دهد تا بدانید که رشته هایی با فرمت های سفارشی چقدر می توانند قدرتمند باشند.

تاکنون ما با تاریخ هایی که مستقیماً به صورت کد تعریف شده اند کار کرده ایم، اما احتمالاً شما به سرعت در شرایطی قرار خواهید گرفت که باید با تاریخ مشخص شده توسط کاربر کار کنید. این موضوع به طرز شگفت آوری پیچیده ای است زیرا روش های زیادی برای نوشتن تاریخ وجود دارد. چارچوب دات نت می تواند در این امر به شما کمک کند ، زیرا همانطور که در مثالهای قبلی نشان داده شده است ، تمام تقویم ها را پشتیبانی می کند ، اما شما هنوز هم باید به کاربر کمک کنید تا تاریخ را با فرمت مورد نظر خود تعیین کند. پس از آن، می توانید از متد ()Parse استفاده کنید تا یک رشته مشخص شده توسط کاربر را به یک شیء DateTime تبدیل کنید، مانند این:

var usCulture = new System.Globalization.CultureInfo(“en-US”);
Console.WriteLine(“Please specify a date. Format: ” + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate = DateTime.Parse(dateString, usCulture.DateTimeFormat);
Console.WriteLine(“Date entered (long date format):” + userDate.ToLongDateString());

این مثال، در واقع بسیار جالب است؛ زیرا نشان می دهد که چارچوب دات نت می تواند تا چه اندازه به ما کمک کند؛ تا زمانی که یک نمونه از کلاس CultureInfo را در اختیار داریم و می خواهیم از آن استفاده کنیم؛ (در این مورد US English می باشد -نگران نباشید؛ کلاس CultureInfo را با جزئیات بیشتری مطرح خواهیم کرد). به زودی به این کلاس دست پیدا می کنیم و به واسطه آن کاربر مطلع می شود که چه نوع فرمتی را ترجیح می دهد. سپس از آن دوباره در خط چهارم استفاده می کنیم تا در واقع ورودی را تجزیه کنیم. در خط آخر؛ ما تاریح مشخص شده توسط کاربر را در خروجی داریم؛ اکنون زمان آن رسیده است که از فرمتی استفاده کنیم که توسط سیستم مشخص شده است.

با این حال می دانیم که متد ()Parse خیلی سختگیر است – اگر کاربر تاریخ را به فرمت مورد انتظار وارد نکند؛ یک خطا رخ می دهد. به همین دلیل، استفاده از متد ()TryParse ایده بهتری است – این متد نیز دقیقاً همان ویژگی ها را دارد اما به شما اجازه می دهد بررسی نمایید که آیا تاریخ می تواند تجزیه شود یا خیر؛ و خطایی رخ نمی دهد. در ادامه نسخه اصلاح شده مثال قبلی را مشاهده می کنید:

var usCulture = new System.Globalization.CultureInfo(“en-US”);
Console.WriteLine(“Please specify a date. Format: ” + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate;
if (DateTime.TryParse(dateString, usCulture.DateTimeFormat, System.Globalization.DateTimeStyles.None, out userDate))
Console.WriteLine(“Valid date entered (long date format):” + userDate.ToLongDateString());
else
Console.WriteLine(“Invalid date specified!”);

خلاصه

کار با تاریخ و زمان بسیار مهم و البته بسیار پیچیده است. خوشبختانه؛ چارچوب دات نت اینجاست تا با کلاس DateTime در تمام موقعیت ها به ما کمک کند.


منبع: sariasan.com