Swift iOS doRelativeDate格式具有不同的值,除了“今天”和“昨天” [英] Swift iOS doesRelativeDateFormatting have different values besides "Today" and "Yesterday"?
问题描述
我有一些日期,我正在使用相对日期,如今天,昨天,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屋!