【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型への型変換方法を記述しておきます。

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を使わずこのサイトを完全自作でサイト運営中〜

自作iOSアプリ

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

mapping

自分だけの地図を作ろう!-mapping-

無料posted withアプリーチ

割り勘アプリ-bill-

旅行におすすめ!
割り勘アプリ-bill-

無料posted withアプリーチ

Imakoko

現在地を取得するアプリ!Imakoko

無料posted withアプリーチ

ふるログ

ふるさと納税管理アプリ-ふるログ-

無料posted withアプリーチ

Remind-シンプル通知アプリ-

シンプル通知アプリ-Remind-

無料posted withアプリーチ

CLIPURL

好きな記事をクリップしよう!-CLIPURL-

無料posted withアプリーチ

記録カレンダー

続けたを可視化できるアプリ!記録カレンダー

無料posted withアプリーチ

Githubにて
iOSアプリのソースコードを公開中!

自作Webアプリ

子育て知識共有サイト-mikata-

子育て知識共有サイト-mikata-

フレームワーク:Laravel/Vue.js

作成の流れQiita「Laravel×Vue.jsを使って初めてWebアプリを自作しました!」

感想:初めて作成したWebアプリです!メールアドレスでの会員登録や質問投稿、回答やコメント、いいねやフォローなどSNSに近い機能を実装してみました。レビューや修正すべきポイントなどを教えていただけると嬉しいです!

New Article

index