[Swift] カレンダーや時刻のデータを扱う DateComponents

2018年4月24日(更新: 2018年4月24日)

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時間前)の時刻が得られています。

コメントを残す

メールアドレスが公開されることはありません。