Swift iOS doesRelativeDateFormatting除了"今天"和"昨天"之外还有不同的价值?

Jus*_* W. 15 date relative-date nsdateformatter ios swift

我有一些日期,我试图使用相对日期,如"今天,昨天,1周前,1个月前"等...

这是我使用的Swift代码:

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.doesRelativeDateFormatting = true
let uploadDate = dateFormatter.stringFromDate(date)
Run Code Online (Sandbox Code Playgroud)

仅代表"今天"和"昨天",其余日期如下所示:2014年11月24日2014年11月17日等...

有没有其他方法来表示使用相对约会而不是实际日期的所有日期?

Leo*_*bus 22

编辑/更新:Xcode 8.3.2•Swift 3.1

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

extension Date {
    var yearsFromNow: Int {
        return Calendar.current.dateComponents([.year], from: self, to: Date()).year!
    }
    var monthsFromNow: Int {
        return Calendar.current.dateComponents([.month], from: self, to: Date()).month!
    }
    var weeksFromNow: Int {
        return Calendar.current.dateComponents([.weekOfYear], from: self, to: Date()).weekOfYear!
    }
    var daysFromNow: Int {
        return Calendar.current.dateComponents([.day], from: self, to: Date()).day!
    }
    var isInYesterday: Bool {
        return Calendar.current.isDateInYesterday(self)
    }
    var hoursFromNow: Int {
        return Calendar.current.dateComponents([.hour], from: self, to: Date()).hour!
    }
    var minutesFromNow: Int {
        return Calendar.current.dateComponents([.minute], from: self, to: Date()).minute!
    }
    var secondsFromNow: Int {
        return Calendar.current.dateComponents([.second], from: self, to: Date()).second!
    }
    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 isInYesterday { return "Yesterday" }
        if daysFromNow > 0 { return "\(daysFromNow) day" + (daysFromNow > 1 ? "s" : "") + " 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 ""
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

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: 2019, month:  4, day: 18, hour: 22, minute: 39).date!
let date3 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  2, hour: 12, minute: 38).date!
let date4 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  14, hour: 3, minute: 0).date!
let date5 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  17, hour: 23, minute: 45).date!
let date6 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  18, hour: 19, minute:  17).date!
let timeOffset1 = date1.relativeTime // "3 years ago"
let timeOffset2 = date2.relativeTime // "1 month ago"
let timeOffset3 = date3.relativeTime // "2 weeks ago"
let timeOffset4 = date4.relativeTime // "4 days ago"
let timeOffset5 = date5.relativeTime // "Yesterday"
let timeOffset6 = date6.relativeTime // "Just now"
Run Code Online (Sandbox Code Playgroud)

  • `NSDateFormatter`非常彻底国际化/本地化.(例如,你今天只能用英语获得今天/昨天/明天,但其他语言也有其他相关日期的文字 - 例如日语中的おととい和明后日 - 而Apple的课程使用它们.(`NSDateComponentsFormatter`非常适合处理时间/日期间隔也是如此.)如果你做这样的事情,你就会把处理各种国际日期/时间格式问题的负担从Apple转移到你自己身上. (9认同)

iwa*_*bed 8

iOS 13+ 现在有RelativeDateFormatter

例如:https: //nshipster.com/formatter/#relativedatetimeformatter

let formatter = RelativeDateTimeFormatter()
formatter.localizedString(from: DateComponents(day: 1, hour: 1)) // "in 1 day"
formatter.localizedString(from: DateComponents(day: -1)) // "1 day ago"
Run Code Online (Sandbox Code Playgroud)

或者

formatter.localizedString(for: date, relativeTo: Date())
Run Code Online (Sandbox Code Playgroud)


Dev*_*nal 6

您应该查看 Mattt Thompsons 关于 NSDateComponentsFormatter 的博客文章

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
Run Code Online (Sandbox Code Playgroud)

示例(马特·汤普森)