(2022/05/19 更新)
Dateはカレンダーやタイムゾーンに依存しない「特定の時点」を示す構造体です。
単体で日時の比較や、時間間隔の計算等が可能ですが、夏時間、閏年、うるう秒、暦法(ユリウス暦やグレゴレオ歴等)等は考慮されませんので、正確に算出する為にはCalendar構造体と組み合わせて使用します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.6
【iOS】15.4
【macOS】Monterey バージョン 12.3
現在日時の取得
引数無しのイニシャライザで現在の日時を取得できます。
1 2 3 4 5 6 |
/// 現在日時の取得 let date = Date() // 日本時間の 2020/04/10 21:00:00 に実行 print(date) // 2020-04-10 12:00:00 +0000 |
print出力した結果はGMT(グリニッジ標準時)表記の為、日本時間から9時間ずれていますが、全く同じ「特定の時点」を示しています。
特定の日時を生成
Calendar構造体とDateComponents構造体を組み合わせて特定の日時を生成します。
1 2 3 4 5 6 7 8 9 |
/// カレンダーを生成 let calendar = Calendar(identifier: .gregorian) // 西暦(gregorian)カレンダー // 2020/04/10 21:00:00 の日時を生成 let date = calendar.date(from: DateComponents(year: 2020, month: 4, day: 10, hour: 21, minute: 0, second: 0)) print(date!) // 2020-04-10 12:00:00 +0000 |
使用するカレンダーが変わると、設定した日時の意味合いが変わるので注意が必要です。
例えば、西暦(.gregorian)の代わりに、和暦(.japanese)を使用すると、令和2020年と解釈され、出力結果は、
1 2 3 |
4038-04-10 12:00:00 +0000 |
となります。
日時を秒単位で進める/戻す
1 2 3 |
Date.addingTimeInerval(Double) -> Date |
引数に秒数を指定して、n秒後の日時を生成します。
マイナス値を指定すると、n秒前の日時が生成されます。
あくまで絶対値を調整するだけですので、時間、日、月などの暦の概念を考慮する場合は、Calendarを使用する必要があります。
1 2 3 |
Date.addTimeInerval(Double) |
こちらは自らが保持する日時情報にインターバルを追加するメソッドです。
自身を更新する為、変数(var)として宣言されていなければいけません。
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// 現在の日時取得 let date = Date() print(date) // 2020-05-01 23:48:54 +0000 /// 日時を1日分(86,400秒)進めたDate構造体を生成 var date2 = date.addingTimeInterval(60 * 60 * 24) print(date2) // 2020-05-02 23:48:54 +0000 /// Date構造体を1日分進める date2.addTimeInterval(60 * 60 * 24) print(date2) // 2020-05-03 23:48:54 +0000 |
簡略系
演算子(+,-)および代入演算子(+=,-=)を使用した、加減算も可能です。
こちらの方がコードがすっきりしますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// 現在の日時取得 let date = Date() print(date) // 2020-05-01 23:48:54 +0000 /// 日時を1日分(86,400秒)進めたDate構造体を生成 var date2 = date + (60 * 60 * 24) print(date2) // 2020-05-02 23:48:54 +0000 /// Date構造体を1日分進める date2 += (60 * 60 * 24) print(date2) // 2020-05-03 23:48:54 +0000 |
時間差を取得する
1 2 3 |
Date.distance(to: Date)-> TimeInterval |
引数で指定した他の日時との時間差を秒数で取得します。
戻り値のTimeIntervalはDouble型です。
比較対象が過去の場合はマイナス値が戻ります。
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// カレンダーを生成 let calendar = Calendar(identifier: .gregorian) // 西暦(gregorian)カレンダー /// 2020/04/10 21:00:00 の日時を生成 let date = calendar.date(from: DateComponents(year: 2020, month: 4, day: 10, hour: 21, minute: 0, second: 0)) /// 2020/04/11 21:00:00 の日時を生成 let date2 = calendar.date(from: DateComponents(year: 2020, month: 4, day: 11, hour: 21, minute: 0, second: 0)) /// 2つの日時の差(秒数)を取得 let timeInterval = date!.distance(to: date2!) print(timeInterval) // “86400.0” |
日時の比較
Dateの比較には比較演算子が使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/// カレンダーを生成 let calendar = Calendar(identifier: .gregorian) /// 2つの日時を生成 let date1 = calendar.date(from: DateComponents(year: 2020, month: 4, day: 10)) // 4月10日 let date2 = calendar.date(from: DateComponents(year: 2020, month: 4, day: 11)) // 4月11日 print(date1!) print(date2!) /// 日時の比較 if date1! > date2! { print("date1 > date2") } else if date1! < date2! { print("date1 < date2") } else { print("date1 == date2") } |
出力結果
1 2 3 4 5 |
2020-04-09 15:00:00 +0000 2020-04-10 15:00:00 +0000 date1 < date2 |
Dateから日時の各要素を取得する
Date型から年、月、時刻、曜日などの各要素を取得するにはCalendar構造体のcomponentメソッドを使用します。
1 2 3 |
Calendar.component(component, from: Date) -> Int |
【引数】
component
取得する要素をCalendar.Component(列挙型)で指定します。
指定可能な値は次の通りです。
識別子 | 意味 |
---|---|
.year | 年 |
.month | 月 |
.day | 日 |
.hour | 時間 |
.minute | 分 |
.second | 秒 |
.nanosecond | ナノ秒(1秒=1,000,000,000ナノ秒) |
.weekOfYear | 今年に入って何週目かを表す値 |
.weekOfMonth | 今月に入って何週目かを表す値 |
.weekday | 曜日を示す識別子1〜N、gregorianではN=7、1=日曜日 |
.weekdayOrdinal | 今月に入って何回目の該当曜日かを表す値(「第n火曜日」のnの部分) |
.era | 時代を示す値使用するカレンダーが西暦(gregorian)の場合は、紀元前(0)または紀元後(1)のどちらか、和暦(japanese)の場合は元号を示す値(大化=0、昭和=234、令和=236、等)を示す。 |
from
対象の日時(Date型)を指定します。
【戻り値】
取得した要素(Int型)を返します。
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/// 現在の日時を取得 let now = Date() // 日本時間の May 19, 2022 at 6:59 AM に実行 /// 西暦(gregorian)カレンダーを生成 let calendar = Calendar(identifier: .gregorian) /// 各要素を取り出し let year = calendar.component(.year, from: now) // 2022 let month = calendar.component(.month, from: now) // 5 let day = calendar.component(.day, from: now) // 19 let hour = calendar.component(.hour, from: now) // 6 let minute = calendar.component(.minute, from: now) // 59 let second = calendar.component(.second, from: now) // 39 let nanosecond = calendar.component(.nanosecond, from: now) // 790418028 let weekOfYear = calendar.component(.weekOfYear, from: now) // 21 let weekOfMonth = calendar.component(.weekOfMonth, from: now) // 3 let weekday = calendar.component(.weekday, from: now) // 5 let weekdayOrdinal = calendar.component(.weekdayOrdinal, from: now) // 3 let era = calendar.component(.era, from: now) // 1 |