LoginSignup
25
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-14

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

これを言い換えると、前回表示した日を表す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)

参考

25
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
20