關於處理日期的那些事兒(Date 物件)

取得日期相當的容易,一行程式碼就解決了,但如果要隨心所欲的使用它,可就沒那麼容易了,為什麼這樣說呢?因為我們將會遇到要處理日期的格式、時區等等之類的問題,而且,幾乎每個專案都會使用到,所以今天就跟著法蘭克一次來搞懂它吧,並把有關於處理日期的那些事兒模組化,如此就能適用在每個專案裡囉!

法蘭克的 iOS 世界
5 min readMay 29, 2018

大綱

  • 取得系統日期時間
  • 將系統日期格式化
  • 將系統日期轉換為當地的日期
  • 將系統日期轉換為民國日期
  • 日期大小比較
  • 透過單例模式將有關於 Date 的方法模組化

取得系統日期時間

Date 物件單純只是表示一個特定的時間點。進一步的說,Date 裡記錄的是自 2001/1/1 以來的時間,時區是 GMT+0。

😱😱😱 這時間看來不太對,輸出的結果有 +0000,這就是表示這個是以 GMT+0 的時區來列印的。簡單來說,這是美國時間,因為台灣時間是 GMT+8。所以,這並不是我們要的,我們要的資料是必須經過轉換的。請接著往下看後續將會介紹時區的轉換。

如果不清楚什麼是時區?台灣位於哪個時區?可參考以下 wiki 的說明

將系統日期格式化

如果要將日期格式化,那就得必須請出 DateFormatter 這個物件來協助我們了。

第 3 行 => 設定日期的 style 為 full 格式。

第 4 行 => 設定時間的 style 為 medium 格式。

備註:格式有很多種,法蘭克只是列舉兩種。

將系統日期轉換為當地的日期

如果要將日期格式轉成我們所在的地區、時區、格式等等,那還是得透過 DateFormatter 這個物件來協助我們。

第 3 行=> 設定日期格式,有關於日期格式可參考以下連結的表格。

以下就舉幾種格式的例子來說明以上那張表格的意思:

  • 月份(MM) 和分鐘(mm) 大小寫之分 => 單純只是為了區別月份和分鐘。
  • yyyy/yyy/yy/y => 顯示結果為 2014/2014/14/4,3 個 y 與 4 個 y 是一樣的,但為了便於理解故通常會寫成 4 個 y。
  • MMMM/MMM/MM/M => 顯示結果為一月/一月/01/1,4 個 M 顯示全名,3 個 M 顯示縮寫。不過對中文來說顯示是一樣的,英文才是 January 和 Jan。
  • dddd/ddd/dd/d => 顯示結果為星期三/周三/01/1,4 個 d 顯示全名,3 個 d 顯示縮寫。和 M 一樣對中文來說顯示是一樣的,英文才是
    Wednesday 和 Wen。

第 4 行=> 設定地區為台灣。可用以下方式來查找出所有的地區。

第 5 行=> 設定時區為台灣。可用以下方式來查找出所有的時區。

第 6 行 => 透過 DateFormatter 的 string(from:) 將日期轉換為指定的地區、時區、格式。

補充:既然有將 Date 轉成字串的方法,當然也有將字串轉成日期的方法囉!DateFormatter 的 date(from:) 即是將字串反轉回日期的方法。

將系統日期轉換為民國日期

如果要將取得的系統日期轉換為民國日期就必須得切換日曆(Calendar)。

這裡跟「將系統日期轉換為當地的日期」都一樣,只有多了第 6 行這個切換日曆的動作。

備註:可切換的日曆名稱。

日期大小比較

必須是兩個都是 Date 型態才有辦法作比較,而比較的方式有兩種。

  • 直接使用運算子「<」、「>」、「=」來作比較。
  • 透過 Date 的 compare(_:) 來作比較。

第 1 行 => 生成一日期。

第 2 行 => 生成一日期並加上 10 秒。

第 3 行 => 比較結果。ComparisonResult 若為升冪(orderedAscending)則代表 date1 小於 date2。

補充:升冪的意思即為小排到大,所以可理解為 date1 小於 date2。

透過單例模式將有關於 Date 的方法模組化

為了降低隅合度,通常都會將元件模組化,以便於在開發新專案的時侯,能快速的建構環境。而常用的設計模式就是使用 extension 或是單例來達到此效果,法蘭克比較習慣使用單例,以下就使用單例的模式將今天所學的模組化一番😀

不知道大家有沒有發現,第 12、13、26、27 行都是依 OS 的地區、時區來取得日期格式,為什麼要這樣寫?因現行的 App 通常都是支援多國語系的,這意味著 App 是跨地區、時區被使用的,所以這樣寫才是比較正確的!

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

--

--