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