Dateの操作でよく使うものをまとめました。
生成
let calendar = Calendar(identifier: .gregorian)
let date = calendar.date(from: DateComponents(year: 2016, month: 10, day: 1))
// -> 2016年10月1日 0時0分
-
Calendar.current
を使用するとローカル環境によってカレンダーが変わることに注意- カレンダーが違うと「2016年10月1日」と言っても違う日時を指すことになるので、西暦で指定したい場合は
.gregorian
のカレンダーを使用すること - 例えば西暦 (
.gregorian
) 2016年 = 和暦 (.japanese
) 28年
- カレンダーが違うと「2016年10月1日」と言っても違う日時を指すことになるので、西暦で指定したい場合は
- タイムゾーンを指定したい場合は
calendar.timeZone
を変更する- デフォルトはローカル環境のタイムゾーン
要素取得
// date: 2016年10月1日 0時0分
calendar.component(.day, from: date)
// -> 1
要素追加
// date: 2016年10月1日 0時0分
calendar.date(byAdding: .day, value: 1, to: date)
// -> 2016年10月2日 0時0分
calendar.date(byAdding: DateComponents(hour: 1, minute: 1), to: date)
// -> 2016年10月1日 1時1分
- 週を足したい場合は
weekOfYear
かweekOfMonth
を使用
要素置き換え
// date: 2016年10月1日 0時0分
var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond], from: date)
components.month = 9
calendar.date(from: components)
// -> 2016年9月1日 0時0分
-
components.day = 32
など日の範囲を超えて指定すると月が繰り上がる - マイナスも指定可
要素再設定
// date: 2016年10月1日 2時34分
calendar.date(bySetting: .month, value: 9, of: date)
// -> 2017年9月1日 0時0分
-
指定した要素にマッチするまで日時が進むor戻ることに注意
- 上の例では、月の指定だけにも関わらず2016年から2017年まで進み、時間が0時0分に変わっている
- 進むか戻るかは実装によるらしい
- より詳細なコントロールが必要な場合は
nextDate(after:matching:matchingPolicy:behavior:direction:)
を使用すること
差の取得
// date: 2016年10月1日 0時0分
// date2: 2016年10月10日 0時0分
calendar.dateComponents([.day], from: date, to: date2).day
// -> 9
別の日時の取得
一日の初め
// date: 2016年10月1日 2時34分
calendar.startOfDay(for: date)
// -> 10月1日 0時0分
次の週末
// date: 2016年10月1日 2時34分
calendar.nextWeekend(startingAfter: date)
// -> DateInterval (2016年10月8日 0時0分 から 2016年10月10日 0時0分)
- iOS 10 以上
判定
calendar.isDateInToday(date) // 今日か
calendar.isDateInTomorrow(date) // 明日か
calendar.isDateInWeekend(date) // 週末か
calendar.isDateInYesterday(date) // 昨日か
calendar.isDate(date, inSameDayAs: date2) // ある日と同じ日か
比較
date == date2 // 等値比較
date < date2 // 大小比較