【Swift】DateComponentsとは?使用方法とDate型との違い

【Swift】DateComponentsとは?使用方法とDate型との違い

この記事からわかること

  • SwiftDateComponentsとは?
  • Date型との違い
  • インスタンス作成方法
  • Date型への変換方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Swiftで日付関連の情報を扱うDateComponents構造体についてまとめていきます。

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)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index