DAY 24 DateTime
DateTime
表示時間的瞬間,通常以一天的日期和時間表示。
今天來介紹日期格式的使用方式。
DateTime 是一個 Struct 結構,表示某一個時間點,如現在這個時分秒、資料建立的那一天,也可以用來計算程式執行的時間。
建立一個 DateTime
建立一個 DateTime 可以透過 new 初始化,或者 DateTime 的靜態類別來產生。
透過 new 的方式,我們可以指定任何一天的任何一個時間點,如
1 | var today = new DateTime (2018, 11, 3); |
最常使用的為這兩種方法,給予年月日的 int 引數,以及給予年月日時分秒的 int 引數。
透過靜態屬性傳回的 DateTime,則只能選擇現在,如
1 | var today = DateTime.Today; |
因為是程式執行當下的系統時間,所以可以用來計算程式執行的時間點與時間差。
DateTime 屬性
1 | int now = DateTime.Now; |
這邊列出部分的屬性,其中 DayOfWeek 是一個 enum 值,是一個從星期日開始數到星期六的枚舉,可以得到 DateTime 是屬於一周中的禮拜幾,而 DayOfYear 則是屬於一年中的第幾天。
計算 DateTime
建立一個日期格式的目的,當然是做日期的計算,例如計算天數差異、是否符合特定的日期區間,或者上面提到的程式執行相關作業等。
Add
日期格式的加減,用數字來進行加減,並傳回一個新的 DateTime 如
1 | var now = DateTime.Now; |
每一個代表時間的屬性都有對應的加減方法,可以看到只有一個相對的方法,藉由正負數來加減,比較常用的有建立某個月的最後一天時,如
1 | var theLastDayOfNovember = new DateTime (2018, 12, 1).AddDays (-1); |
藉由下一個月份的第一天往前推一天來取得,不然每一個月的天數不一樣,在初始化時,還要針對該月份做變動。
Subtract
日期格式的相減,用另一個 DateTime 去做相減,傳回一個 TimeSpan,如
1 | var startTime = DateTime.Now; |
這邊使用執行續的方法,讓程式等待 2 * 1000 毫秒,來假裝執行一個運算過程,並記錄花費時間。
題外話:TimeSpan 是一個以日為最大單位的時間格式。
用減的方式也可以直接使用 - 符號,如
1 | var spentTime = endTime - startTime; |
因為 Add 不能 DateTime + DateTime,而是 DateTime 以及 TimeSpan 相加,所以使用 + 時依然是 DateTime 以及 TimeSpan,所以不特別介紹。
DateTime 轉換成字串
當日期格式需要顯示在畫面時,就需要轉換成特定字串,像是最常見的 2018/11/03 格式,或者更多的格式時,都可以來使用 ToString 來進行,也有只印出年日月的方法 ToLongDateString、ToShortDateString
或者只印出時分秒的方法 ToLongTimeString、ToShortTimeString
,也可以客製化自己的時間格式,如 11/2018/03 這種奇怪格式,我們只需要在 ToString 帶入相關的引數,就可以替換成符合的成員了,如
1 | var monthYearDay = DateTime.Now.ToString ("MM/yyyy/dd"); |
引數內容就請自行到官方查看,這邊就不列出相關內容了,
民國年
有些時候可能會要求顯示年份需以民國年的方式,因為 DateTime 無法繼承,所以我們用擴充方法的方式來擴充功能,這邊很簡單的示範如
1 | class Program { |
多了一個傳回民國年的方法,以及傳回民國年組合的日期字串,不是什麼很好用的例子,只是舉例一下別忘了有擴充方法,即便無法更改原類別,我們還是可以多一些自己想要的方法。
一些小結論
今天介紹了基礎的日期格式用法,算是常用的類別之一,所以很簡單的說明如何去初始化,以及一些運算操作,順便回憶一下之前提到的擴充方法。
感謝閱讀。
參考連結
DateTime Struct (System) | Microsoft Docs
DateTime.ToString Method (System) | Microsoft Docs