Swift iOS doRelativeDate格式具有不同的值,除了“今天”和“昨天” [英] Swift iOS doesRelativeDateFormatting have different values besides "Today" and "Yesterday"?

查看:174
本文介绍了Swift iOS doRelativeDate格式具有不同的值,除了“今天”和“昨天”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些日期,我正在使用相对日期,如今天,昨天,1周前,1个月前等等。



这是我使用的Swift代码:

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

只有今天和昨天被表示,其余日期如下所示:
2014年11月24日
2014年11月17日
etc ... <

解决方案

是否有另一种方式来表示所有的日期, / div>

更新: Xcode 8•Swift 3



如果您使用扩展程序和NSCalendar来帮助您,日期计算,您应该如下:

 延期日期{
func ye ars(from date:Date) - > Int {
return Calendar.current.dateComponents([。year],from:date,to:self).year? 0
}
func months(from date:Date) - > Int {
return Calendar.current.dateComponents([。month],from:date,to:self).month? 0
}
func周(从日期:日期) - > Int {
return Calendar.current.dateComponents([。weekOfYear],from:date,to:self).weekOfYear? 0
}
func days(from date:Date) - > Int {
return Calendar.current.dateComponents([。day],from:date,to:self).day? 0
}
func hours(from date:Date) - > Int {
return Calendar.current.dateComponents([。hour],from:date,to:self).hour? 0
}
func minutes(from date:Date) - > Int {
return Calendar.current.dateComponents([。minute],from:date,to:self).minute? 0
}
func seconds(from date:Date) - > Int {
return Calendar.current.dateComponents([。second],from:date,to:self).second? 0
}
var relativeTime:String {
let now = Date()
if now.years(from:self)> 0 {
return now.years(from:self).description +year+ {return now.years(from:self)> 1? s:}()+前
}
if now.months(from:self)> 0 {
return now.months(from:self).description +month+ {return now.months(from:self)> 1? s:}()+ago
}
if now.weeks(from:self)> 0 {
return now.weeks(from:self).description +week+ {return now.weeks(from:self)> 1? s:}()+前
}
if now.days(from:self)> 0 {
if now.days(from:self)== 1 {returnYesterday}
return now.days(from:self).description +days ago
}
if now.hours(from:self)> 0 {
return\(now.hours(from:self))小时+ {return now.hours(from:self)> 1? s:}()+ago
}
if now.minutes(from:self)> 0 {
return\(now.minutes(from:self))minute+ {return now.minutes(from:self)> 1? s:}()+ago
}
if now.seconds(from:self)> 0 {
if now.seconds(from:self)< 15 {returnJust now}
return\(now.seconds(from:self))second+ {return now.seconds(from:self)> 1? s:}()+前
}
返回
}
}

测试

  let cal = Calendar (标识符:.gregorian)


let date1 = cal.date(from:DateComponents(year:2015,month:6,day:14,hour:22,minute:39)) !
let date2 = cal.date(from:DateComponents(year:2016,month:9,day:18,hour:22,minute:39))!
let date3 = cal.date(from:DateComponents(year:2016,month:10,day:2,hour:12,minute:38))!
let date4 = cal.date(from:DateComponents(year:2016,month:10,day:3,hour:15,minute:41))!
let date5 = cal.date(from:DateComponents(year:2016,month:10,day:3,hour:16,minute:9))!

let timeOffset1 = date1.relativeTime //1年前
let timeOffset2 = date2.relativeTime //2 weeks ago
let timeOffset3 = date3.relativeTime // Yesterday
let timeOffset4 = date4.relativeTime //28分钟前
let timeOffset5 = date5.relativeTime //Just now


I have a number of dates that I am trying to represent using a relative date such as "Today, Yesterday, 1 week ago, 1 month ago" etc...

This is the Swift code I am using:

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

Only "Today" and "Yesterday" are represented and the rest of the dates appear like the below: Nov 24, 2014 Nov 17, 2014 etc...

Is there another way to represent all the dates using relative dating instead of the actual dates?

解决方案

Update: Xcode 8 • Swift 3

It is really easy if you use extensions and NSCalendar to help you with your date calculations, you should do as follow:

extension Date {
    func years(from date: Date) -> Int {
        return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
    }
    func months(from date: Date) -> Int {
        return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
    }
    func weeks(from date: Date) -> Int {
        return Calendar.current.dateComponents([.weekOfYear], from: date, to: self).weekOfYear ?? 0
    }
    func days(from date: Date) -> Int {
        return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
    }
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
    }
    func minutes(from date: Date) -> Int {
        return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
    }
    func seconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
    }
    var relativeTime: String {
        let now = Date()
        if now.years(from: self)   > 0 {
            return now.years(from: self).description  + " year"  + { return now.years(from: self)   > 1 ? "s" : "" }() + " ago"
        }
        if now.months(from: self)  > 0 {
            return now.months(from: self).description + " month" + { return now.months(from: self)  > 1 ? "s" : "" }() + " ago"
        }
        if now.weeks(from:self)   > 0 {
            return now.weeks(from: self).description  + " week"  + { return now.weeks(from: self)   > 1 ? "s" : "" }() + " ago"
        }
        if now.days(from: self)    > 0 {
            if now.days(from:self) == 1 { return "Yesterday" }
            return now.days(from: self).description + " days ago"
        }
        if now.hours(from: self)   > 0 {
            return "\(now.hours(from: self)) hour"     + { return now.hours(from: self)   > 1 ? "s" : "" }() + " ago"
        }
        if now.minutes(from: self) > 0 {
            return "\(now.minutes(from: self)) minute" + { return now.minutes(from: self) > 1 ? "s" : "" }() + " ago"
        }
        if now.seconds(from: self) > 0 {
            if now.seconds(from: self) < 15 { return "Just now"  }
            return "\(now.seconds(from: self)) second" + { return now.seconds(from: self) > 1 ? "s" : "" }() + " ago"
        }
        return ""
    }
}

Testing

let cal =  Calendar(identifier: .gregorian)


let date1 = cal.date(from: DateComponents(year: 2015, month:  6, day: 14, hour: 22, minute: 39))!
let date2 = cal.date(from: DateComponents(year: 2016, month:  9, day: 18, hour: 22, minute: 39))!
let date3 = cal.date(from: DateComponents(year: 2016, month: 10, day:  2, hour: 12, minute: 38))!
let date4 = cal.date(from: DateComponents(year: 2016, month: 10, day:  3, hour: 15, minute: 41))!
let date5 = cal.date(from: DateComponents(year: 2016, month: 10, day:  3, hour: 16, minute:  9))!

let timeOffset1 = date1.relativeTime // "1 year ago"
let timeOffset2 = date2.relativeTime // "2 weeks ago"
let timeOffset3 = date3.relativeTime // "Yesterday"
let timeOffset4 = date4.relativeTime // "28 minutes ago"
let timeOffset5 = date5.relativeTime // "Just now"

这篇关于Swift iOS doRelativeDate格式具有不同的值,除了“今天”和“昨天”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆