Help us understand the problem. What is going on with this article?

Swiftで日付の経過日数を計算する

ユーザに何らかの通知やアラートを表示する際に、前回表示した日から○日経過していたら表示するというような条件を設定することがあると思います。

これを言い換えると、前回表示した日を表すDateオブジェクトと今日を表すDateオブジェクト間の日数が○より大きいとなります。

2つのDateオブジェクト間の日数は以下のコードで算出できます。

let elapsedDays = Calendar.current.dateComponents([.day], from: date1, to: date2).day

eplapsedDaysInt?型になります。

条件が前回表示した日から90日経過していたら表示するだったら、

if epalsedDays > 90 {
    ...
}

となります。

※日付を扱う際にはタイムゾーンへの考慮も必要です。

24時間で1日経過

24時間経たないと1日経過したとはみなされません。

以下のdate1date2の差は数ミリ秒しかないので、経過日数は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)

参考

https://stackoverflow.com/a/46770148/5793173

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away