Table of Contents
Swift でカレンダーや時刻のデータを扱う DateComponents の使い方と Date との相互変換についてです。
Date から DateComponents を得る
Date から DateComponents を得るには以下のメソッドを使用します。
Calendar.current.dateComponents(components: , from: )
dateComponents の第一引数には、指定したい日時の要素を書きます。
例えば、現在の日時から要素(年、月、日、時、分)を指定して DateComponents を得るには以下のように書きます。
let nowComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: Date()) print(nowComponents) //出力例 → year: 2018 month: 4 day: 24 hour: 10 minute: 40 isLeapMonth: false
上記以外にも曜日(.weekday)や秒(.second)、タイムゾーン(.timeZone)などの指定ができます。
グレゴリオ暦(西暦)であることを明確にするには以下のように識別子を設定します。特に指定しなくてもデフォルトでこれになります。
let nowComponents = Calendar(identifier: Calendar.Identifier.gregorian).dateComponents([.year, .month, .day, .hour, .minute], from: Date())
日時の各要素をひとつずつ取り出すには以下のように書きます。
let nowComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: Date()) print(nowComponents.year!) // 2018 print(nowComponents.month!) // 4 print(nowComponents.day!) // 24 print(nowComponents.hour!) // 10 print(nowComponents.minute!) // 40
また、特定の日時を自分で指定して DateComponents を作成することができます。これは通知(UNNotification)の時間指定などに使用できます。
var myDateComponents = DateComponents() myDateComponents.year = 2020 myDateComponents.month = 4 myDateComponents.day = 20 print(myDateComponents) // year: 2020 month: 4 day: 20 isLeapMonth: false
DateComponents から Date を得る
上記とは逆に DateComponents から Date に変換するには以下のメソッドを使用します。
Calendar.current.date(from:)
以下は、自分で設定した DateComponents から Date を得る例です。
var myDateComponents = DateComponents() myDateComponents.year = 2020 myDateComponents.month = 4 myDateComponents.day = 20 myDateComponents.hour = 10 myDateComponents.minute = 20 myDateComponents.second = 30 myDateComponents.timeZone = Calendar.current.timeZone print(myDateComponents) let date = Calendar.current.date(from: myDateComponents) print(date!)
出力結果は以下のようになります。
timeZone: Asia/Tokyo (current) year: 2020 month: 4 day: 20 hour: 10 minute: 20 second: 30 isLeapMonth: false 2020-04-20 01:20:30 +0000
指定した DateComponents からグリニッジ標準時(日本の9時間前)の時刻が得られています。