مفهوم زمان در .NET با استفاده از ساختار DateTime بررسی میشود. روالهایی برای تبدیل بین زمان محلی و UTC وجود دارد. محاسبات را میتوان به کمک TimeSpan انجام داد.
کلاس TimeZoneInfo روالهایی برای مدیریت تفاوتهای میان مناطق زمانی ارائه میدهد. کلاس TimeZoneInfo همچنین متدهایی دارد که کار با ساعت تابستانی را آسان میکنند.
کلاس CultureInfo از قالبهای تاریخ و زمان وابسته به فرهنگ پشتیبانی میکند.
برای پشتیبانی از کدنویسی چندسکویی، کلاس RuntimeInformation به شما امکان میدهد تشخیص دهید کد شما روی کدام سیستمعامل اجرا میشود: Linux، Windows یا OSX.
در این تمرین دوباره به دنیای سالنها برگشتهاید (که نخستین بار در تمرین datetimes معرفی شد). مانند چند مورد از پروژههایتان، یکی دیگر از مشتریان شما موفقیت زیادی کسب کرده و علاوه بر مرکز اصلیاش در نیویورک، شعبههایی در لندن و پاریس باز کرده است.
متد استاتیک Appointment.ShowLocalTime() را پیادهسازی کنید که یک زمان UTC میگیرد و آن را بهصورت زمان محلی برمیگرداند
// For a student in NY
Appointment.ShowLocalTime(new DateTime(2030, 7, 25, 13, 45, 0));
// => {2030, 7, 25, 8, 45, 0}
سالنها خودشان مسئول ثبت نوبتهایشان هستند. زمان ورودی نسبت به موقعیت سالن محلی است. برای نمونه، اگر کسی برای سالن نیویورک زمانی مانند ۱۳:۴۵ را برای یک نوبت وارد کند، انتظار دارد مشتری کمی بعد از ناهار بیاید. به همین ترتیب، اگر کسی برای سالن لندن زمانی مانند ۱۳:۴۵ وارد کند، او هم انتظار دارد مشتری کمی بعد از ناهار برسد.
دانستن شناسهی منطقهی زمانی نیویورک، لندن و پاریس به شما کمک میکند.
روی Mac (OSX) و Linux اینها عبارتاند از:
روی Windows، اینها عبارتاند از:
یک overload از متد استاتیک Appointment.Schedule() را پیادهسازی کنید که یک مکان و رشتهی زمان میگیرد و زمان UTC نوبت را برمیگرداند.
پیادهسازی Schedule() باید طوری باشد که کد، پس از ساخت، روی Linux، Windows و Mac اجرا شود. این نخستین تمرینی است که باید نگران سیستمعامل باشید. لازم است مسیرهای کد جداگانهای داشته باشید تا تفاوت شناسههای منطقهی زمانی که در بالا توضیح داده شد را پوشش دهید.
از معتبر بودن رشتههای تاریخ-زمان ورودی اطمینان داریم.
Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}
متد استاتیک Appointment.GetAlertTime() را پیادهسازی کنید تا هشدارها را ۱ روز (early)، ۱ ساعت و ۴۵ دقیقه (standard) و ۳۰ دقیقه (late) پیش از نوبت ارائه دهد.
Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}
متد استاتیک Appointment.HasDaylightSavingChanged() را پیادهسازی کنید تا اگر ساعت تابستانی در ۷ روز گذشته فعال یا غیرفعال شده باشد، true برگرداند.
Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true
برای اینکه نوبتها بتوانند با قالبی آشنا برای کارکنان محلی ثبت شوند، به شما مأموریت داده شده است که یک رویهی آزمایشی بسازید تا تاریخها و زمانها بتوانند با قالب پیشفرض موقعیت سالن وارد شوند.
متد Appointment.NormalizeDateTime() را پیادهسازی کنید که یک رشتهی تاریخ-زمان خوشساخت با قالبی متناسب با موقعیت میگیرد و آن را به یک شیء DateTime تبدیل میکند. هیچ تلاشی برای تبدیل تاریخ-زمان به UTC انجام نمیشود.
اگر قالب نامعتبری وارد شود، باید یک DateTime با مقدار 1/1/1 برگردانده شود.
Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.London);
// => {2019, 11, 25, 13, 45, 0}
Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.NewYork);
// => {1, 1, 1, 0, 0, 0}