日期(Date)與日期選擇器(UIDatePicker)的應用

關鍵字:Date、DateFormatter、Locale、Calendar、UIDatePicker

Photo by Andrik Langfield on Unsplash

一、Date

利用Date來產生使用者當前時間的實體。

let date = Date() // 取得使用者當前時間

二、DateFormatter

可透過DateFormatter進行時間的轉換。

  1. Date轉換成String
let dateFormatter = DateFormatter() // 時間格式實體       dateFormatter.dateFormat = "yyyy/MM/dd" // 時間格式設定let dateToDateString = dateFormatter.string(from: date) // Date轉String
print(dateToDateString) // "2022/06/11"

時間格式相關設定可以參考以下網頁:

2. String轉換成Date

if let dateStringToDate = dateFormatter.date(from: "2022/06/11") {
print(dateStringToDate) // 2022-06-10 16:00:00 +0000
}

這裡可以注意到print出來的時間與實際給的時間差了8小時,這是正常的,因為print是顯示+0的時區,所以不用擔心。

可以將Date轉回String在Label上顯示驗證是正確的喔!

@IBOutlet weak var timeLabel: UILabel! // 記得拉IBOutlettimeLabel.text = dateFormatter.string(from: dateStringToDate) // Date轉String
實際在模擬器上顯示是對的

三、Locale

Locale是處理語系相關的結構。

前面例子可透過『MMMM』格式化字串成完整的月份顯示,但在不同裝置上會有不同的結果,例如:英文語系會顯示 June / 中文語系會顯示 六月。

假設想要都顯示一樣的結果,這時就可以設置DateFormatter對應的Locale。

let date = Date() // 取得使用者當前時間let dateFormatter = DateFormatter() // 時間格式實體
dateFormatter.locale = Locale(identifier: "zh-Hant-TW") // 繁體中文-台灣
dateFormatter.dateFormat = "MMMM" // 時間格式設定
var dateToDateString = dateFormatter.string(from: date)
print(dateToDateString) // "六月"
dateFormatter.locale = Locale(identifier: "en") // 英文
dateToDateString = dateFormatter.string(from: date)
print(dateToDateString) // "June"

常見的字串對應語系:

en 英文
zh 中文
zh-Hant 繁體中文
zh-Hant-TW 繁體中文-台灣
zh-Hant-HK 繁體中文-香港
zh-Hans 簡體中文
zh_Hans_CN 簡體中文-中國
ja_jp 日文
ko 韓文

四、Calendar

用於時間與時間之間的計算。

例1:後天是幾月幾號?(今天是2022–06–12)

let date = Date()
let calendar = Calendar.current
if let theDayAfterTomorrowDate = calendar.date(byAdding: .day, value: 2, to: date) {
print(theDayAfterTomorrowDate) // "2022-06-14 03:40:02 +0000\n"
}

利用date(byAdding: ,value: ,to: )可選擇要增減的單位為何,day、era、hour、minute、month…

例2:2022–01–01 到 2022–06–12 共相差幾天?

透過dateComponents計算date1與date2的差異,[.day]代表比較天數。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
if let date1 = dateFormatter.date(from: "2022/01/01"), let date2 = dateFormatter.date(from: "2022/06/12") {
let calendar = Calendar.current
let dateCompnents = calendar.dateComponents([.day], from: date1, to: date2)
print(dateCompnents.day!) // 162
}

上述可以取得相差天數,但如果同時想得知幾個月又幾天,可以將程式改成以下:

let dateCompnents = calendar.dateComponents([.month, .day], from: date1, to: date2)
print(dateCompnents.month!) // 5
print(dateCompnents.day!) // 11

例3:比較日期大小

直接使用比較運算子來進行比較即可。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
if let date1 = dateFormatter.date(from: "2022/01/01"), let date2 = dateFormatter.date(from: "2022/06/12") {

if date1 > date2 {
print("date1 大於 date2")
}

if date1 == date2 {
print("date1 等於 date2")
}

if date1 < date2 {
print("date1 小於 date2") // date1 小於 date2
}
}

五、UIDatePicker

提供使用者選擇日期的元件。

  1. 拉一個UIDatePicker至Storyboard下方並於ViewController設置IBOutlet.
  2. 拉一個UIButton按鈕至Storyboard中央並於ViewController設置IBAction,用於點選按鈕時得知使用者目前選擇的日期為何。
Storyboard 畫面的 UIButton 與 UIDatePicker
ViewController

UIDatePicker使用非常簡單,透過date屬性即可取得對應的日期時間:

let date = datePicker.date

此外,也可在Storyboard介面中更改UIDatePicker的樣式(Preferred Style)與時間模式(Mode)。

最後,完整程式如下:

import UIKitclass ViewController: UIViewController {@IBOutlet weak var datePicker: UIDatePicker!

override func viewDidLoad() {
super.viewDidLoad()
}@IBAction func buttonTapped(_ sender: UIButton) {

let date = datePicker.date
print(date)
}
}

以上大概簡單說明了時間與UIDatePicker的運用,謝謝收看!

--

--