ユーザに何らかの通知やアラートを表示する際に、前回表示した日から○日経過していたら表示するというような条件を設定することがあると思います。
これを言い換えると、前回表示した日を表すDateオブジェクトと今日を表すDateオブジェクト間の日数が○より大きいとなります。
2つのDateオブジェクト間の日数は以下のコードで算出できます。
let elapsedDays = Calendar.current.dateComponents([.day], from: date1, to: date2).day
※eplapsedDays
はInt?
型になります。
条件が前回表示した日から90日経過していたら表示するだったら、
if epalsedDays > 90 {
...
}
となります。
※日付を扱う際にはタイムゾーンへの考慮も必要です。
24時間で1日経過
24時間経たないと1日経過したとはみなされません。
以下のdate1
とdate2
の差は数ミリ秒しかないので、経過日数は0になります。
let date1 = Date()
let date2 = Date()
let elapsedDays = Calendar.current.dateComponents([.day], from: date1, to: date2).day!
print(elapsedDays) // 0
例えば前回表示した日から10日経過していたら通知を表示するというようなケースを考えます。
// yyyy年MM月01日 12時
let lastDate = DateComponents(calendar: Calendar.current, day: 1, hour: 12).date!
// yyyy年MM月11日 11時
let now = DateComponents(calendar: Calendar.current, day: 11, hour: 11).date!
let elapsedDays = Calendar.current.dateComponents([.day], from: lastDate, to: now).day!
print(elapsedDays) // 9
日付の差だけを見ると感覚的には10日間経ってるような気がしますが、10日間になるには1時間足りません。
日付だけで比較したい場合はCalendar#startOfDay(for:)
を使って時刻を合わせると良いです。
// yyyy年MM月01日 12時
let lastDate = DateComponents(calendar: Calendar.current, day: 1, hour: 12).date!
// yyyy年MM月11日 11時
let now = DateComponents(calendar: Calendar.current, day: 11, hour: 11).date!
let lastDateStartOfDay = Calendar.current.startOfDay(for: lastDate)
let nowStartOfDay = Calendar.current.startOfDay(for: now)
let elapsedDays = Calendar.current.dateComponents([.day], from: lastDateStartOfDay, to: nowStartOfDay).day!
print(elapsedDays)
参考