時間 的概念在 .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}
沙龍各自負責受理自己的預約。輸入的時間是相對於沙龍所在地的當地時間。舉例來說,如果有人為紐約沙龍輸入 13:45 的預約時間,他們會預期客戶在午餐過後不久抵達。同樣地,如果有人為倫敦沙龍輸入 13:45,他們也會預期客戶在午餐過後不久抵達。
知道紐約、倫敦和巴黎的時區 ID 會很有幫助。
在 Mac(OSX)和 Linux 上,這些是:
在 Windows 上,這些是:
實作靜態 Appointment.Schedule() 多載,它接受一個地點和時間字串,並回傳該預約的 UTC 時間。
Schedule() 的實作必須讓程式碼在建置後能在 Linux、Windows 和 Mac 上執行。這是第一個你需要考慮作業系統的練習。你必須用不同的程式碼路徑來因應上述時區 ID 的差異。
輸入的日期時間字串保證是有效的。
Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}
實作靜態 Appointment.GetAlertTime(),以便在預約前 1 天(提早)、1 小時 45 分鐘(標準)和 30 分鐘(延後)發出提醒。
Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}
實作靜態 Appointment.HasDaylightSavingChanged(),如果日光節約時間在最近 7 天內生效或失效,就回傳 true。
Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true
為了讓預約能以當地員工熟悉的格式建立,你被指派要撰寫一個實驗性的常式,讓日期和時間可以依照沙龍所在地的預設格式輸入。
實作 Appointment.NormalizeDateTime() 方法,它接受一個格式正確、且符合該地點格式的日期時間字串,並將它轉換成 DateTime 物件。這裡不會嘗試將日期時間轉換成 UTC。
如果輸入的格式不正確,則應回傳值為 1/1/1 的 DateTime。
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}