DateComponentsは日時の構成要素(年、月、時刻、曜日など)を保持/表現する構造体です。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.6.1
【iOS】15.5
【macOS】Monterey バージョン 12.3
プロパティ一覧
DateComponentsを構成する、プロパティ一覧です。
すべてnil値を許すオプショナル型です。
各々の値は使用するCalendarによって、解釈が変わります。
すべての値は、set/get可能です。
calendar
他のプロパティを解釈する為のカレンダー(Calendar)を示します。
timeZone
TimeZoneを示します。
era
時代を示す値(Int)
カレンダーが西暦(gregorian)の場合は、紀元前(0)または紀元後(1)のどちらか、和暦(japanese)の場合は元号を示す値(大化=0、昭和=234、令和=236、等)を示します。
year
年
yearForWeekOfYear
年単位週番号の基準年
quarter
四半期を示す値。
(※Apple公式マニュアルでは、「この値を解釈する仕組みはほとんど実装されていない」と記されているので、単なる入れ物と思っていたほうがよさそう)
month
月
isLeapMonth
うるう月か否かのフラグ(Bool)。うるう月の場合はtrueをセットします。
weekOfMonth
今月に入って何週目か、またはその月の週の数を表す値。
週番号についてで解説するように、適用カレンダーによって解釈が変わります。
weekOfYear
今年に入って何週目か、またはその年の週の数を表す値
週番号についてで解説するように、適用カレンダーによって解釈が変わります。
weekday
曜日を示す識別子
1〜N、gregorianではN=7、1=日曜日
または平日の数を表す
weekdayOrdinal
今月に入って何回目の該当曜日かを表す値(「第n火曜日」のnの部分)
day
日にちまたは日数を表す
hour
時刻としての時間、または長さとしての時間を表す
minute
時刻としての分、または長さとしての分を表す
second
時刻としての秒、または長さとしての秒を表す
nanosecond
時刻としてのナノ秒、または長さとしてのナノ秒を表す
(1秒=1,000,000,000ナノ秒)
使用方法
次のイニシャライザで初期化して使用します。
1 2 3 |
DateComponents(calendar: Calendar?, timeZone: TimeZone?, era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?, minute: Int?, second: Int?, nanosecond: Int?, weekday: Int?, weekdayOrdinal: Int?, quarter: Int?, weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?) |
日時コンポーネントの値を初期化し、各プロパティの値を引数で指定します。
各引数は省略可能で、省略した場合はnilが設定されます。
isLeapMonth以外のプロパティはこのイニシャライザで初期化可能です。
使用例1(日時情報の生成)
DateComponentsで日時情報を生成し、Date型に変換する例です。
Date型の変換にはCalendar構造体のdateメソッドを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
import Foundation /// "2022/7/1 10:30" の日時情報生成 let component = DateComponents(year: 2022, month: 7, day: 1, hour: 10, minute: 30) /// Date型に変換 let date = Calendar.current.date(from: component) /// 確認 print(date!) |
出力結果です。
TimeZoneが日本時間の環境で実行した為、生成した日時情報は(GMT+9)で解釈され、GMT+0表示では1:30になります。
1 2 3 |
2022-07-01 01:30:00 +0000 |
使用例2(Date型から要素を取得する)
Date型から各要素を取得しDateComponents型に変換する例です。
Calendar構造体のdateComponentsメソッドを使用します。
1 2 3 4 5 6 7 8 9 |
/// Date型から全ての要素を取得します /// 引数にTimeZoneを使用します。 Calendar.dateComponents(in: TimeZone, from: Date) -> DateComponents /// Date型から指定した要素のみ取得します /// 変換にあたり、CalenderのTimeZoneが使用されます。 Calendar.dateComponents(要素指定, from: Date) -> DateComponents |
【引数】
in
Date型から取得した要素を解釈する為のTimeZoneを指定します。
from
変換元のDate型を指定します。
要素指定
Date型から取得する要素をCalendar.Componentの配列で指定します。
例えば、年月日のみを取得する場合は"[.year, .month, .day]"とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import Foundation let now = Date() // 現在日時の取得 let calendar = Calendar(identifier: .gregorian) // 西暦カレンダー let timeZone = TimeZone.current // デフォルトのタイムゾーン /// Date型から全要素の取得 let components = calendar.dateComponents(in: timeZone, from: now) print("calendar : \(components.calendar!)") print("timezone : \(components.timeZone!)") print("era : \(components.era!)") print("year : \(components.year!)") print("yearForWeekOfYear : \(components.yearForWeekOfYear!)") print("quarter : \(components.quarter!)") print("month : \(components.month!)") print("isLeapMonth : \(components.isLeapMonth!)") print("weekOfMonth : \(components.weekOfMonth!)") print("weekOfYear : \(components.weekOfYear!)") print("weekday : \(components.weekday!)") print("weekdayOrdinal : \(components.weekdayOrdinal!)") print("day : \(components.day!)") print("hour : \(components.hour!)") print("minute : \(components.minute!)") print("second : \(components.second!)") print("nanosecond : \(components.nanosecond!)") |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
calendar : gregorian (fixed) timezone : Asia/Tokyo (fixed (equal to current)) era : 1 year : 2022 yearForWeekOfYear : 2022 quarter : 0 month : 7 isLeapMonth : false weekOfMonth : 3 weekOfYear : 29 weekday : 5 weekdayOrdinal : 2 day : 14 hour : 7 minute : 20 second : 26 nanosecond : 558763980 |
DateComponentsは上記以外にも日時操作に関する様々な場面で使用されます。