ذخیره سازی تاریخ و زمان به شکل متنی و مستقل از فرهنگ برنامه
  در این ترفند به معرفی یک مشکل متداول هنگام ذخیره سازی تاریخ و زمان به شکل متنی و راه حل جالبی در مورد آن می پردازیم
   C#
   ۱۱۲۹۸
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۹۰/۵/۲۹
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

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

همانطور که حتما مطلع می باشید دستیابی به تاریخ و زمان در برنامه ها معمولا با استفاده از کلاس DateTime (یا DateTimeOffset ) انجام می شود و در صورتی که قصد داشته باشیم به تاریخ و زمان کنونی در محلی که برنامه در حال اجرا است، دسترسی پیدا کنیم می توانیم از دستور زیر استفاده کنیم.

DateTime.Now

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

// USA               --> MM/DD/YYYY -- سال/روز/ماه
 
// United Kingdom    --> DD/MM/YYYY -- سال/ماه/روز

همانگونه که ملاحظه می کنید در فرهنگ های انگلیسی و امریکایی یک تفاوت بسیار مهم وجود دارد و آن این است که جای "ماه" و "روز" در این دو فرهنگ جابجا می باشد.

برای ذخیره نمودن تاریخ و زمان به شکل متنی می توانیم تابع ToString را به شکل زیر فراخوانی نموده و خروجی مربوطه را در محل مورد نظر خود (مانند یک فایل متنی) ذخیره کنیم.

string now = DateTime.Now.ToString();

//output: 20/08/2011 12:00:54 AM

اما مشکل زمانی آغاز می شود قصد داشته باشیم تاریخ را از فایل متنی خوانده و تبدیل به کلاس DateTime کنیم. این عمل معمولا به شکل زیر انجام می شود.

string dateString = "20/08/2011 12:00:54 AM";

DateTime date = DateTime.Parse(dateString);

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

دلیل این موضوع را می توان با یک مثال ساده توضیح داد. فرض کنید که فرهنگ رایانه ای که تاریخ را ذخیره نموده است انگلیس باشد. در نتیجه اولین قسمت تاریخ دخیره شده، نشان دهنده "روز" می باشد. در آینده اگر این برنامه در محیطی اجرا شود که فرهنگ آن امریکایی باشد، برنامه تصور می کند که اولین قسمت تاریخ نشان دهنده "ماه" است! و مشکل از همینجا پدیدار می شود.

برای رهایی از مشکل بالا راه حل های متفاوتی وجود دارد که یکی از ساده ترین و بهترین راه حل ها، ذخیره سازی تاریخ و زمان مستقل از فرهنگ محیط اجرای برنامه می باشد. برای انجام این کار کافیست که هنگام فراخوانی تابع ToString پارامتر "o" را برای آن به شکل زیر ارسال کنیم.

string now = DateTime.Now.ToString("o");

خروجی قطعه کد بالا به مشابه زیر می باشد.

2011-08-20T00:04:54.0431442+04:30

این خروجی کاملا مستقل از فرهنگ برنامه می باشد و بنابراین همیشه و در هر جایی بدون هیچ مشکلی می توانیم با استفاده از قطعه کد زیر آن را به کلاس DateTime تبدیل نماییم.

string dateString = "2011-08-20T00:04:54.0431442+04:30";
            
DateTime date = DateTime.Parse(dateString);