除了“今天”和“昨天”之外,Swift iOS的doesRelativeDateFormatting具有不同的值?

我有一些date,我试图用一个相对的date,如“今天,昨天,1周前,1个月前”等…

这是我正在使用的Swift代码:

let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = .MediumStyle dateFormatter.doesRelativeDateFormatting = true let uploadDate = dateFormatter.stringFromDate(date) 

只有“今天”和“昨天”才会显示,其余date如下所示:2014年11月24日2014年11月17日等…

有没有另一种方法来代表所有的date使用相对约会,而不是实际的date?

编辑/更新: Xcode 8.3.2•Swift 3.1

如果您使用扩展和日历方法来帮助您进行日历计算,那么这非常简单:

 extension Date { var yearsFromNow: Int { return Calendar.current.dateComponents([.year], from: self, to: Date()).year ?? 0 } var monthsFromNow: Int { return Calendar.current.dateComponents([.month], from: self, to: Date()).month ?? 0 } var weeksFromNow: Int { return Calendar.current.dateComponents([.weekOfYear], from: self, to: Date()).weekOfYear ?? 0 } var daysFromNow: Int { return Calendar.current.dateComponents([.day], from: self, to: Date()).day ?? 0 } var hoursFromNow: Int { return Calendar.current.dateComponents([.hour], from: self, to: Date()).hour ?? 0 } var minutesFromNow: Int { return Calendar.current.dateComponents([.minute], from: self, to: Date()).minute ?? 0 } var secondsFromNow: Int { return Calendar.current.dateComponents([.second], from: self, to: Date()).second ?? 0 } var relativeTime: String { if yearsFromNow > 0 { return "\(yearsFromNow) year" + (yearsFromNow > 1 ? "s" : "") + " ago" } if monthsFromNow > 0 { return "\(monthsFromNow) month" + (monthsFromNow > 1 ? "s" : "") + " ago" } if weeksFromNow > 0 { return "\(weeksFromNow) week" + (weeksFromNow > 1 ? "s" : "") + " ago" } if daysFromNow > 0 { return daysFromNow == 1 ? "Yesterday" : "\(daysFromNow) days ago" } if hoursFromNow > 0 { return "\(hoursFromNow) hour" + (hoursFromNow > 1 ? "s" : "") + " ago" } if minutesFromNow > 0 { return "\(minutesFromNow) minute" + (minutesFromNow > 1 ? "s" : "") + " ago" } if secondsFromNow > 0 { return secondsFromNow < 15 ? "Just now" : "\(secondsFromNow) second" + (secondsFromNow > 1 ? "s" : "") + " ago" } return "" } } 

testing

 let calendar = Calendar.current let date1 = DateComponents(calendar: calendar, year: 2016, month: 3, day: 14, hour: 22, minute: 39).date! let date2 = DateComponents(calendar: calendar, year: 2017, month: 5, day: 18, hour: 22, minute: 39).date! let date3 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 2, hour: 12, minute: 38).date! let date4 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 3, hour: 14, minute: 45).date! let date5 = DateComponents(calendar: calendar, year: 2017, month: 6, day: 3, hour: 15, minute: 18).date! let timeOffset1 = date1.relativeTime // "1 year ago" let timeOffset2 = date2.relativeTime // "2 weeks ago" let timeOffset3 = date3.relativeTime // "Yesterday" let timeOffset4 = date4.relativeTime // "33 minutes ago" let timeOffset5 = date5.relativeTime // "Just now" 

你应该看看有关NSDateComponentsFormatter的Mattt Thompsons博客文章

http://nshipster.com/nsdatecomponents/和http://nshipster.com/nsformatter/

 let formatter = NSDateComponentsFormatter() formatter.unitsStyle = .Full let components = NSDateComponents() components.day = 1 components.hour = 2 let string = formatter.stringFromDateComponents(components) // 1 day, 2 hours 

例子(由Mattt汤普森)

 var relativeTime: String { // don't forget spacing on these constants. let futurePrefix = "" // " in" is a viable choice here... let pastSuffix = " ago" // " ago" is a viable choice here... let now = NSDate() for (method, unitName) in [ (now.years, "year"), (now.months, "month"), (now.weeks, "week"), (now.days, "day"), (now.hours, "hour"), (now.minutes, "minute"), (now.seconds, "second") ] { let qty = method(self) let absQty = abs(method(self)) if absQty > 0 { return (qty < 0 ? futurePrefix : "") + String(absQty) + " " + unitName + (absQty == 1 ? "": "s") + (qty > 0 ? pastSuffix : "") } } return "" } 

Leo Dabus实现相对时间的另一种实现方式,可以实现未来和过去,并且更加简洁。 (Swift2.3)