【Swift】DateComponentsとは?使用方法とDate型との違い
この記事からわかること
- SwiftのDateComponentsとは?
- Date型との違い
- インスタンスの作成方法
- Date型への変換方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftで日付関連の情報を扱うDateComponents構造体についてまとめていきます。
DateComponents構造体とは?
DateComponents
はカレンダーとタイムゾーンで評価される単位 (年、月、日、時、分など)を情報に保つ構造体です。日付や時刻といった情報を保持する点では同じですが、Date型とは異なり時代(元号)やうるう年かどうかなどもプロパティとして保持しています。
isLeapMonth
以外の全てのプロパティがオプショナル型として定義されており、必要な情報だけを定義して使用することも可能です。
保持しているプロパティ
DateComponents {
calendar: Calendar? = nil, // この構造体の他の値を解釈するために使用されるカレンダー
timeZone: TimeZone? = nil, // タイムゾーン
era: Int? = nil, // 時代または時代の数
year: Int? = nil, // 年
month: Int? = nil, // 月
day: Int? = nil, // 日
hour: Int? = nil, // 時間
minute: Int? = nil, // 分
second: Int? = nil, // 秒
nanosecond: Int? = nil, // ナノ秒
weekday: Int? = nil, // 曜日
weekdayOrdinal: Int? = nil, // 今月に入って何回目の曜日か
quarter: Int? = nil, // 四半期または四半期のカウント
weekOfMonth: Int? = nil, // 今月に入って何週目
weekOfYear: Int? = nil, // 今年に入って何週目
yearForWeekOfYear: Int? = nil // 年単位週番号の基準年
isLeapMonth: Bool? // うるう年かどうか
}
インスタンスの作成方法と使い方
DateComponents
はイニシャライザを使用して任意の日時情報を保持したインスタンスを生成することができます。インスタンス化時には全てのプロパティに値を渡す必要はないので定義したい情報だけを適切なプロパティに渡します。
var dateComponent = DateComponents(hour: 10, minute: 30)
dateComponent.year = 2022
dateComponent.month = 10
print(dateComponent)
// 結果:year: 2022 month: 10 hour: 10 minute: 30 isLeapMonth: false
また作成したインスタンスのプロパティに後から値をセットすることも可能です。値を設定していないプロパティは空なので設定したプロパティのみを保持したDateComponents
になります。(isLeapMonth
はあります)
この方法を使うと直感的に日時を指定するだけで簡単に定義することができます。
Calendar構造体から作成する
Calendar
構造体のdateComponents
メソッドを使用することでインスタンスを作成することもできます。この場合はDate
型のそのまま変換することができます。
var dateComponent = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
print(dateComponent)
// 結果:calendar: gregorian (current) timeZone: Asia/Tokyo (fixed (equal to current)) era: 1 year: 2022 month: 10 day: 4 hour: 19 minute: 50 second: 38 nanosecond: 356261968 weekday: 3 weekdayOrdinal: 1 quarter: 0 weekOfMonth: 2 weekOfYear: 41 yearForWeekOfYear: 2022 isLeapMonth: false
Calendar
構造体で生成すると全てのプロパティに値が格納されたインスタンスを取得できます。
必要な情報のみを抽出する
Calendar
構造体を使ってインスタンスを作成する際に必要なプロパティだけを保持させる場合は以下のように配列形式でプロパティを指定します。
var dateComponent = Calendar.current.dateComponents([.year, .month, .day], from: Date())
print(dateComponent)
// 結果:year: 2022 month: 10 day: 4 isLeapMonth: false
これで不要な情報を除去してスッキリしたDateComponents
が取得できます。
Date型への型変換
DateComponents
は簡単に日付情報を構築できますがDate
型とは異なるので使用頻度は少ないです。なので汎用性の高いDate
型への型変換方法を記述しておきます。
おすすめ記事:【Swift】Date構造体の使い方!日付の計算や比較方法
DateComponents
構造体が保持するdate
プロパティからDate型の日時情報へ参照できます。
var dateComponent = DateComponents(calendar: Calendar.current, year: 2022, month: 10, day: 4)
print(dateComponent.date)
// 結果:Optional(2022-10-03 15:00:00 +0000)
date
プロパティはcalendar
プロパティに値が格納されていないとnil
になるので注意してください。
calendar
プロパティを保持していない場合はCalendar
構造体のdate
メソッドを使用して型変換できます。
var dateComponent = DateComponents(calendar: Calendar.current, year: 2022, month: 10, day: 4)
let date = Calendar.current.date(from: dateComponent)
print(date)
// 結果:Optional(2022-10-03 15:00:00 +0000)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。