Dateはカレンダーやタイムゾーンに依存しない「特定の時点」を示す構造体です。
単体で日時の比較や、時間間隔の計算等が可能ですが、夏時間、閏年、うるう秒、暦法(ユリウス暦やグレゴレオ歴等)等は考慮されませんので、正確に算出する為にはCalendar構造体と組み合わせて使用します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2
【iOS】13.4
【macOS】Catalina バージョン 10.15.4
現在日時の取得
引数無しのイニシャライザで現在の日時を取得できます。
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 |
あわせて読みたい記事




