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)