Swift - check if a timestamp is yesterday, today, tomorrow, or X days ago Swift - check if a timestamp is yesterday, today, tomorrow, or X days ago ios ios

Swift - check if a timestamp is yesterday, today, tomorrow, or X days ago


Swift 3/4/5:

Calendar.current.isDateInToday(yourDate)Calendar.current.isDateInYesterday(yourDate)Calendar.current.isDateInTomorrow(yourDate)

Additionally:

Calendar.current.isDateInWeekend(yourDate)

Note that for some countries weekend may be different than Saturday-Sunday, it depends on the calendar.

You can also use autoupdatingCurrent instead of current calendar, which will track user updates. You use it the same way:

Calendar.autoupdatingCurrent.isDateInToday(yourDate)

Calendar is a type alias for the NSCalendar.


Calendar has methods for all three cases

func isDateInYesterday(_ date: Date) -> Boolfunc isDateInToday(_ date: Date) -> Boolfunc isDateInTomorrow(_ date: Date) -> Bool

To calculate the days earlier than yesterday use

func dateComponents(_ components: Set<Calendar.Component>,                       from start: Date,                           to end: Date) -> DateComponents

pass [.day] to components and get the day property from the result.


This is a function which considers also is in for earlier and later dates by stripping the time part (Swift 3+).

func dayDifference(from interval : TimeInterval) -> String{    let calendar = Calendar.current    let date = Date(timeIntervalSince1970: interval)    if calendar.isDateInYesterday(date) { return "Yesterday" }    else if calendar.isDateInToday(date) { return "Today" }    else if calendar.isDateInTomorrow(date) { return "Tomorrow" }    else {        let startOfNow = calendar.startOfDay(for: Date())        let startOfTimeStamp = calendar.startOfDay(for: date)        let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)        let day = components.day!        if day < 1 { return "\(-day) days ago" }        else { return "In \(day) days" }    }}

Alternatively you could use DateFormatter for Yesterday, Today and Tomorrow to get localized strings for free

func dayDifference(from interval : TimeInterval) -> String{    let calendar = Calendar.current    let date = Date(timeIntervalSince1970: interval)    let startOfNow = calendar.startOfDay(for: Date())    let startOfTimeStamp = calendar.startOfDay(for: date)    let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)    let day = components.day!    if abs(day) < 2 {        let formatter = DateFormatter()        formatter.dateStyle = .short        formatter.timeStyle = .none        formatter.doesRelativeDateFormatting = true        return formatter.string(from: date)    } else if day > 1 {        return "In \(day) days"    } else {        return "\(-day) days ago"    }}

Update:

In macOS 10.15 / iOS 13 RelativeDateTimeFormatter was introduced to return (localized) strings relative to a specific date.


Swift 4 update:

    let calendar = Calendar.current    let date = Date()    calendar.isDateInYesterday(date)    calendar.isDateInToday(date)    calendar.isDateInTomorrow(date)