استفاده از تاریخ در برنامه‏ها بسیار رایج است و NET. هم امکاناتی را برای آن فراهم کرده. بیشتر این امکانات برای تاریخ میلادی موجود است. برای مثال برای تاریخ میلادی به جز توابع داخلی و معمول، کنترلهایی هم برای انتخاب تاریخ در نظر گرفته شده، ولی برای تاریخ شمسی اینطور نیست. تاریخ شمسی به عنوان یک تاریخ استاندارد در نظر گرفته نشده و کنترلی ندارد. فقط میشود از توابع و کلاسهای که در فضای نام System.Globalization قرار گرفته‏اند برای تبدیل و تفکیک تاریخ میلادی به شمسی استفاده کرد، (و بر عکس) که البته در نوع خود پرکاربرد هستند. برای تبدیل تاریخ‏ها به هم به دلیل تفاوتهای علم نجومی که در آنها وجود دارد نیاز به فرمولهای هست که اگر بخواهیم آنها را به کد تبدیل کنیم نیاز به نوشتن کلاسها و توابعی است که مقدار کد را زیاد و احتمال خطا را بالا می‏برند. پس بهتر است که از کلاسهای داخلی NET. برای این کار استفاده کنیم، مگر اینکه چیز خاصی بخواهیم. دو چیز در تبدیل تاریخ مهم هستند، یکی صحت تاریخ ورودی و دیگری خود عمل تبدیل، که NET. برای هر دو امکاناتی دارد. مثالی که در پی می‏آید نوع اعتبار سنجی تاریخ ورودی و تبدیل تاریخهای شمسی، میلادی و قمری را به هم ، بررسی میکند. این کدها در C#‎‎‎ , VB یکی هستند. تصور میشود که خواننده حداقل اطلاعات را درباره Regular Expressions و Globalizarion بداند.

1. برای اعتبار سنجی و استفاده از کلاسهای تاریخ مختلف باید دو فضای نام System.Text.RegularExpressions و System.Globalization را اضافه کنید. سپس تاریخ را از طریق TextBox یا MaskTextBox دریافت کنید. اینجا فرض میشود تاریخ به صورت YYYY/MM/DD وارد میشود.
2. قطعه کد زیر تاریخ ورودی را اعتبار سنجی میکند که آیا درست وارد شده است یا نه و اینکه در چه محدوده‏ای قرار دارد؛ شمسی، میلادی یا قمری؟



If Regex.IsMatch(TextBox.Text, "(19|20|13|14)\d\d[/](0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])") Then
If Regex.IsMatch(mtxtInputDate.Text, "(13)\d") Then
ConvertDate("Persian")
ElseIf Regex.IsMatch(mtxtInputDate.Text, "(14)\d") Then
ConvertDate("Arabic")
ElseIf Regex.IsMatch(mtxtInputDate.Text, "(19|20)\d") Then
ConvertDate("Georegia")


با استفاده از متد IsMatch مقدار وارد شده از جعبه متن را با الگویی که داریم مقایسه می‏کنیم. از چپ به راست الگو را بررسی میکنیم. اولین مقدار وارد شده باید عدد باشد (d\) و بین یکی از اعداد 19، 20، 13 و 14. مقدار بعد باید عدد باشد، و فرقی نمی‏کند چه مقدار (d\). تا ایجا میشود مثلا عدد 1388 را وارد کنیم. مقدار بعد باید حتما علامت / باشد (بر اساس قراردادی که مشخص کردیم). تا اینجا میشود /1388. مقدار بعد که اعتبار سنجی میشود یک عدد دو رقمی بین 01 تا 12 برای وارد کردن ماه است. الگوی [9-1]0 میگوید که مقدار وارد شده باید صفر و به همراه یک عدد بین 1 تا 9 باشد، الگوی [012]1 میگوید مقدار باید یک به همراه یکی از اعداد 0، 1 و یا 2 باشد. این دو الگو با علامت | از هم جدا شده‏اند، به این معنی که یا الگوی [9-1] 0 وارد شود یا الگوی [012] 1. اگر الگوی اول وارد شود میشود از ماه اول (01) تا ماه نهم (09) را وارد کرد، و اگر هم از الگوی دوم وارد شود، ماه‏های 10، 11 و 12 را میشود وارد کرد. تا اینجا میشود وارد کرد 12/1388. مقدار بعدی که اعتبار سنجی میشود دوباره وارد کردن علامت / است برای جدا کردن روز از ماه. و آخرین مقداری که اعتبار سنجی میشود روزهای ماه است عددی بین 01 تا 31. این الگو مانند الگوی وارد کردن ماه است. اگر دقت کنید میبینید که بسیار شبیه است. این الگو به صورت زیر است (علامت | به معنی ‘یا’ هست).


[9-1] 0 = یک صفر همراه با یک عدد بین 1 تا 9 برای روزهای اول تا نهم ماه
[9-0][12] = یکی از اعداد 1 یا 2 به همراه یک عدد بین 0 تا 9 برای روزهای دهم تا بیست و نهم ماه

[01]3= یک 3 به همراه عدد 0 یا 1 برای روزهای سی و سی و یکم ماه


با این اعتبار سنجی میشود مقدار مثلا 19/12/1388 را وارد کرد. اگر یکی از بخشهای الگوی اعتبار سنجی ما با مقدار دریاقت شده از جعبه متن همخوانی نداشته باشد، مقدار False – IsMatch خواهد شد، که نشان از وارد شدن یک مقدار تاریخی اشتباه است. تا اینجای کار مقدار وارد شده صحیح است، اما چطور میشود فهمید مقدار وارد شده میلادی، شمسی یا قمری است. یکی از راه حلها استفاده از همین عبارات با قاعده است. در ادامه کد می‏بینید که بررسی میشود که اولین عدد وارد شده 13، 14، 19 و یا 20 است. واضح است که الگوی استفاده شده یک محدود تاریخی خاصی را در نظر می‏گیرد. مثلا از 1900 تا 2099 برای میلادی. 1887 هم میتواند یک سال میلادی باشد، که در محدوده تاریخی که ما استفاده کردیم نیست. به هر حال با این کار میشود متوجه شد تاریخ وارد شده میلادی، شمسی یا قمری است.
3. ما یک اعتبار سنجی دیگر هم لازم داریم. برای مثال تاریخ 30/12/1388 از صد اعتبار سنجی که بالا بررسی کردیم عبور میکند، چرا که اعداد وارد شده در محدوده صحیح است. اما این تاریخ صحیح نیست و در زمان تبدیل میتواند با مشکل مواجه شود. کسی هست که نداند اسفند ماه 29 روز دارد؟! برای حل این مشکل میشود از روشهای مختلفی استفاده کرد. من یک روش ساده با Try Catch در اینجا پیشنهاد میکنم. اول کد زیر را ببینید و بعد آن را بررسی میکنیم.



Dim getYear As Int32 = mtxtInputDate.Text.Substring(0, 4)
Dim getMonth As Int32 = mtxtInputDate.Text.Substring(5, 2)
Dim getDay As Int32 = mtxtInputDate.Text.Substring(8, 2)





Try
convertedToGregorianDate = persianCalendar.ToDateTime(getYear, getMonth, getDay, 0, 0, 0, 0)
tempString = hijriCalendar.GetYear(convertedToGregorianDate).To String() + "/" _
+ hijriCalendar.GetMonth(convertedToGregorianDate).T oString() + "/" _
+ hijriCalendar.GetDayOfMonth(convertedToGregorianDa te).ToString()

lblShowResult1.Text = convertedToGregorianDate.ToShortDateString()
lblShowResult2.Text = tempString

Me.Height = 157
Catch ex As Exception
RaiseErrorMessage()
End Try


اولین کاری که انجام شده جدا کردن مقدار سال، ماه و روز وارد شده و ریختن آنها در سه متغیر Integer است. در قدم بعد به وسیله کلاسی(persianCalendar) که از کلاس PersianCalendar نمونه سازی شده و با استفاده از متد ToDateTime این کلاس مقدار وارد شده(همان مقدارهای جدا شده سال، ماه و روز) را به میلادی تبدیل و در متغیر از نوع تاریخ (convertedToGregorianDate) وارد میکنیم. در گام بعد از نمونه ساخته شده کلاس HijriCalendar یعنی hijriCalander استفاده میکنیم برای تبدیل تاریخ میلادی (که خود از تبدیل تاریخ شمسی بدست آمده) به تاریخ قمری. با این روش تاریخ وارد شده شمسی به میلادی و قمری تبدیل میشود. متدهای GetYear, GetMonth و GetDayOfMonth سال، ماه و روز را از یک تاریخ استاندارد استخراج میکنند. اعتبار سنجی دوباره در همین بلوک Try Catch ارزیابی میشود. به عبارتی اگر تاریخ وارد شده 30/12/1388 باشد، به دلیل اینکه این تاریخ وارد شده صحیح نیست، کامپایلر نمیتواند آن را تبدیل کند، لذا یک استثناء پرتاب میکند که در این بلوک آن را کنترل میکنیم. توجه داشته باشید که در امکانات NET. نمیشود تاریخ شمسی را به قمری به طور مستقیم تبدیل کرد، از این جهت ابتدا آن را به میلادی و بعد مقدار تبدیل شده میلادی را به قمری تبدیل میکنیم.

مثالی که در بالا آورده شد، یک نمونه ساده برای اعتبار سنجی تاریخ ورودی و تبدیل آن با استفاده از NET. است. استفاده همه جانبه از تاریخ در یک برنامه نیاز به اعتبار سنجی پیچیده‏تر و استفاده دقیق‏تر از توابع است. و این مهم تا جایی پیش میرود که شاید لازم باشد خودتان دست بکار شوید و کلاس و متدهای را بنویسید.