Skip to content

Instantly share code, notes, and snippets.

@mminer
Last active October 12, 2016 17:32
Show Gist options
  • Save mminer/d0840a31efda20b2a47e0fb222f76e46 to your computer and use it in GitHub Desktop.
Save mminer/d0840a31efda20b2a47e0fb222f76e46 to your computer and use it in GitHub Desktop.
Date extension to display the date in relative terms (e.g. "5 hours ago").
// Adapted from http://stackoverflow.com/a/1248
private let minuteInterval: TimeInterval = 60
private let hourInterval: TimeInterval = 60 * minuteInterval
private let dayInterval: TimeInterval = 24 * hourInterval
private let monthInterval: TimeInterval = 30 * dayInterval
extension Date {
var relative: String {
// Adapted from http://stackoverflow.com/a/1248
let delta = timeIntervalSinceNow * -1
switch delta {
case _ where delta < 0:
return "in the future"
case _ where delta < 1 * minuteInterval:
let seconds = relativeComponents.second ?? 0
return seconds == 1 ? "one second ago" : "\(seconds) seconds ago"
case _ where delta < 2 * minuteInterval:
return "a minute ago"
case _ where delta < 45 * minuteInterval:
let minutes = relativeComponents.minute ?? 0
return "\(minutes) minutes ago"
case _ where delta < 90 * minuteInterval:
return "an hour ago"
case _ where delta < 24 * hourInterval:
let hours = relativeComponents.hour ?? 0
return "\(hours) hours ago"
case _ where delta < 48 * hourInterval:
return "yesterday"
case _ where delta < 30 * dayInterval:
let days = relativeComponents.day ?? 0
return "\(days) days ago"
case _ where delta < 12 * monthInterval:
let months = relativeComponents.month ?? 0
return months <= 1 ? "one month ago" : "\(months) months ago"
default:
let years = relativeComponents.year ?? 0
return years <= 1 ? "one year ago" : "\(years) years ago"
}
}
private var relativeComponents: DateComponents {
return Calendar.current.dateComponents(
[.year, .month, .day, .hour, .minute, .second],
from: self,
to: Date() // now
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment