نحوه استفاده از DateTime، DateTimeOffset، TimeSpan و TimeZoneInfo در .Net . استفاده از تاریخ در برنامه های NET ، به روش های مختلفی انجام میشود.
[/vc_column_text][/vc_column][/vc_row]
استفاده از تاریخ در برنامه های NET
DateTime
DateTimeOffset
TimeSpan
TimeZoneInfo
کاربردهای متداول تر اطلاعات تاریخ و زمان عبارتند از:
* فقط اطلاعات تاریخ، در صورتی که اطلاعات ساعت مهم نباشد.
* فقط اطلاعات ساعت، در صورتی که اطلاعات تاریخ مهم نباشد.
* برای انعکاس تاریخ و زمان انتزاعی که به زمان و مکان خاصی وابسته نیست (به عنوان مثال، اکثر فروشگاه های زنجیره ای بین المللی در روزهای هفته ساعت ۹ صبح باز می شوند.
* برای بازیابی اطلاعات تاریخ و زمان از منابع خارج از دات نت، معمولاً جایی که اطلاعات تاریخ و زمان در یک نوع داده ساده ذخیره می شود. مثلا خواندن تاریخ از اطلاعات موجود در یک فایل xml .
* برای شناسایی منحصر به فرد و بدون ابهام یک نقطه در زمان. برخی از برنامه ها نیاز دارند که تاریخ و زمان فقط در سیستم میزبان بدون ابهام باشد . برنامههای دیگر نیاز دارند که در همه سیستمها بدون ابهام باشد . یعنی با توجه به فاصله زمانی هر منطقه جغرافیایی تاریخ را تشخیص دهد.
*برای حفظ چندین زمان مرتبط (مانند زمان محلی درخواست کننده و زمان دریافت سرور برای درخواست وب )
*برای انجام محاسبات تاریخ و زمان، احتمالاً با نتیجه ای که به طور منحصر به فرد و بدون ابهام یک نقطه از زمان را مشخص می کند.
دات نت شامل انواع DateTime، DateTimeOffset، TimeSpan و TimeZoneInfo است که همگی می توانند برای ساخت برنامه هایی که با تاریخ و زمان کار می کنند استفاده شوند.
توجه : این مبحث درباره TimeZone بحث نمی کند زیرا عملکرد آن تقریباً به طور کامل در کلاس TimeZoneInfo گنجانده شده است. در صورت امکان از کلاس TimeZoneInfo به جای کلاس TimeZone استفاده کنید.
ساختار DateTimeOffset :
ساختار DateTimeOffset یک مقدار تاریخ و زمان را به همراه یک افست نشان می دهد که نشان می دهد چقدر آن مقدار با UTC تفاوت دارد. بنابراین، مقدار همیشه به طور واضح یک نقطه از زمان را مشخص می کند
نوع DateTimeOffset شامل تمام عملکردهای نوع DateTime به همراه آگاهی منطقه زمانی است. این باعث می شود برای برنامه هایی مناسب باشد که:
* به طور منحصر به فرد و بدون ابهام یک نقطه از زمان را شناسایی کنید.
* محاسبه کلی تاریخ و زمان را انجام دهید
توجه : این موارد برای مقادیر DateTimeOffset بسیار رایج تر از مقادیر DateTime هستند. در نتیجه، DateTimeOffset را به عنوان نوع تاریخ و زمان پیش فرض برای توسعه برنامه در نظر بگیرید
مقدار DateTimeOffset به یک منطقه زمانی خاص مرتبط نیست، اما می تواند از مناطق زمانی مختلفی منشاء بگیرد. مثال زیر مناطق زمانی را فهرست می کند که تعدادی از مقادیر DateTimeOffset (از جمله زمان استاندارد محلی اقیانوس آرام) می توانند به آن تعلق داشته باشند.
خروجی نشان می دهد که هر مقدار تاریخ و زمان در این مثال می تواند حداقل به سه منطقه زمانی مختلف تعلق داشته باشد.
مقدار DateTimeOffset در ۶/۱۰/۲۰۰۷ نشان میدهد که اگر یک مقدار تاریخ و زمان نشاندهنده یک ساعت تابستانی باشد، افست آن از UTC حتی لزوماً با آفست UTC پایه منطقه زمانی مبدا یا با آفست UTC موجود در آن مطابقت ندارد.
زمانی که از محاسبات تاریخ و زمان برای دستکاری مقدار DateTimeOffset استفاده می شود، این می تواند مشکل ساز باشد.
برای بحث در مورد نحوه انجام محاسبات تاریخ و زمان به روشی که قوانین تنظیم منطقه زمانی را در نظر می گیرد، به انجام عملیات حسابی با تاریخ و زمان مراجعه کنید.
ساختار DateTime :
مقدار DateTime تاریخ و زمان خاصی را تعریف می کند.
این شامل یک ویژگی Kind است که اطلاعات محدودی در مورد منطقه زمانی که آن تاریخ و زمان به آن تعلق دارد، ارائه می دهد.
مقدار DateTimeKind توسط ویژگی Kind برگردانده می شود و نشان می دهد که آیا مقدار DateTime شمال زمان محلی (DateTimeKind.Local)، زمان جهانی هماهنگ (UTC) (DateTimeKind.Utc)، یا زمان نامشخص (DateTimeKind.Unspecified) است.
ساختار DateTime برای برنامه هایی با یک یا چند ویژگی زیر مناسب است
* فقط با تاریخ کار کنید
* با زمان کار کنید
* با تاریخ و زمان انتزاعی کار کنید.
* با تاریخها و زمانهایی که اطلاعات منطقه زمانی برای آنها وجود ندارد کار کنید.
* با تاریخ و زمان UTC کار کنید.
* بازیابی اطلاعات تاریخ و زمان از منابع خارج از دات نت، مانند پایگاه داده های SQL. به طور معمول، این منابع اطلاعات تاریخ و زمان را در قالبی ساده که با ساختار DateTime سازگار است ذخیره می کنند.
* محاسبه تاریخ و زمان را انجام دهید، اما در دقت داشته باشید که برای مثال، در یک عملیات اضافی که شش ماه به تاریخ و زمان خاصی اضافه میکند، اغلب مهم نیست که آیا نتیجه برای ساعت تابستانی تنظیم شده است یا خیر.
تنها در صورتی که یک مقدار DateTime نشان دهنده UTC باشد، آن مقدار بدون ابهام یک نقطه از زمان را بدون توجه به سیستم یا منطقه زمانی که در آن مقدار استفاده شده است، شناسایی می کند.
مهم : هنگام ذخیره یا اشتراک گذاری داده های DateTime، باید از UTC استفاده شود و ویژگی Kind مقدار DateTime باید روی DateTimeKind.Utc تنظیم شود.
ساختار TimeSpan :
ساختار TimeSpan یک بازه زمانی را نشان می دهد. دو کاربرد معمولی آن عبارتند از:
بازتاب فاصله زمانی بین دو مقدار تاریخ و زمان. برای مثال، کم کردن یک مقدار DateTime از مقدار دیگر، مقدار TimeSpan را برمیگرداند.
اندازه گیری زمان سپری شده به عنوان مثال، ویژگی Stopwatch.Elapsed مقدار TimeSpan را برمیگرداند که بازه زمانی سپری شده از زمان فراخوانی یکی از روشهای Stopwatch را نشان میدهد که شروع به اندازهگیری زمان سپری شده میکند.
یک مقدار TimeSpan همچنین می تواند به عنوان جایگزینی برای مقدار DateTime استفاده شود، زمانی که آن مقدار زمانی را بدون اشاره به یک روز خاص منعکس می کند.
TimeOfDay و DateTimeOffset.
ویژگی های TimeOfDay، که مقدار TimeSpan را برمی گرداند که زمان را بدون اشاره به تاریخ نشان می دهد.
به عنوان مثال، ساختار TimeSpan می تواند برای منعکس کردن زمان باز یا بسته شدن روزانه یک فروشگاه استفاده شود، یا می توان از آن برای نشان دادن زمانی استفاده کرد که در آن هر رویداد عادی رخ می دهد.
مثال زیر ساختار StoreInfo را تعریف میکند که شامل اشیاء TimeSpan برای زمانهای باز و بسته شدن فروشگاه، و همچنین شی TimeZoneInfo است که منطقه زمانی فروشگاه را نشان میدهد.
این ساختار همچنین شامل دو روش IsOpenNow و IsOpenAt است که نشان میدهد آیا فروشگاه در زمان مشخص شده توسط کاربر، که فرض میشود در منطقه زمانی محلی است، باز است یا خیر.
ساختار StoreInfo سپس می تواند توسط کد مشتری مانند زیر استفاده شود
کلاس TimeZoneInfo :
کلاس TimeZoneInfo هر یک از مناطق زمانی زمین را نشان می دهد و تبدیل هر تاریخ و زمانی را در یک منطقه زمانی به معادل آن در منطقه زمانی دیگر امکان پذیر می کند.
TimeZoneInfo کار با تاریخها و زمانها را امکانپذیر میسازد تا هر مقدار تاریخ و زمان به طور واضح یک نقطه از زمان را مشخص کند.
TimeZoneInfo نیز قابل توسعه است. اگرچه به اطلاعات منطقه زمانی ارائه شده برای سیستم های ویندوز و تعریف شده در رجیستری بستگی دارد، اما از ایجاد مناطق زمانی سفارشی پشتیبانی می کند. همچنین از سریالسازی و سریالزدایی اطلاعات منطقه زمانی پشتیبانی میکند.
در برخی موارد، استفاده کامل از کلاس TimeZoneInfo ممکن است به کار توسعه بیشتری نیاز داشته باشد.
اگر مقادیر تاریخ و زمان با مناطق زمانی که به آن تعلق دارند همراه نباشند، کار بیشتری برای توسعه باید انجام شود.
مگر اینکه برنامه شما مکانیزمی برای پیوند تاریخ و زمان با منطقه زمانی مرتبط با آن ارائه دهد، برای یک تاریخ و مقدار زمانی خاص به راحتی می توان از منطقه زمانی آن جدا شد.
یکی از روشهای پیوند دادن این اطلاعات، تعریف کلاس یا ساختاری است که هم مقدار تاریخ و زمان و هم شی منطقه زمانی مرتبط با آن را در بر میگیرد.
برای استفاده از پشتیبانی منطقه زمانی در دات نت، باید منطقه زمانی را که مقدار تاریخ و زمانی متعلق به آن شی تاریخ و زمانی است، بدانید.
منطقه زمانی اغلب مشخص نیست، به خصوص در برنامه های وب یا شبکه.