しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Swift】DateとDateComponentsの相互変換

Date → DateComponentsの変換とDateComponents → Dateの変換について調べてみました。

Date → DateComponents

下のようにCalendarを使うとDateComponentsを取得できます。

let date = Date()
let components = Calendar.current.dateComponents(in: TimeZone.current, from: date)

components.year // 2017
components.month // 8
components.day // 31

下のように、Dateの一部情報だけを使ってDateComponentsを作る事もできます。

let date = Date()
let components = Calendar.current.dateComponents([.calendar, .year, .month, .day], from: date)
components.year // 2017
components.hour // nil

DateComponents → Date

DateComponentsからDateは下の通りです。
DateComponentsのdateプロパティーを通してDateを取得します。

let components = DateComponents(calendar: Calendar.current, year: 2017, month: 9, day: 1)
components.date // → 2017/9/1 00:00

Dateへの変換ですが、Calendarがセットされてないとnilになるので注意が必要です。

let components = DateComponents(year: 2017, month: 9, day: 1)
components.date // → nil

Calendarさえセットしておけば、Dateには変換できます。

let components = DateComponents(calendar: Calendar.current)
components.date // → 1/1/1 00:00

それとyearとyearForWeekOfYearという近い意味の、両方セットするとどうなるか確かめてみました。
試したところyearForWeekOfYearが優先されるようです。

let components = DateComponents(calendar: Calendar.current, year: 2017, yearForWeekOfYear: 2016)
components.date // → 2016/01/01