如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?
Posted
技术标签:
【中文标题】如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?【英文标题】:How can I rewrite my swift code so that it also considers calculating differences between two dates when one is in the future? 【发布时间】:2016-04-17 22:35:15 【问题描述】:我有一个类函数,它接受一个NSDate
对象并返回一个人类可读的字符串,告诉用户这个日期是多久以前出现的。它看起来像这样:
class func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String
let calendar = NSCalendar.currentCalendar()
let now = NSDate()
let earliest = now.earlierDate(date)
let latest = (earliest == now) ? date : now
let components:NSDateComponents = calendar.components([NSCalendarUnit.Minute , NSCalendarUnit.Hour , NSCalendarUnit.Day , NSCalendarUnit.WeekOfYear , NSCalendarUnit.Month , NSCalendarUnit.Year , NSCalendarUnit.Second], fromDate: earliest, toDate: latest, options: NSCalendarOptions())
if (components.year >= 2)
return "\(components.year) years ago"
else if (components.year >= 1)
if (numericDates)
return "1 year ago"
else
return "last year"
else if (components.month >= 2)
return "\(components.month) months ago"
else if (components.month >= 1)
if (numericDates)
return "1 month ago"
else
return "last month"
else if (components.weekOfYear >= 2)
return "\(components.weekOfYear) weeks ago"
else if (components.weekOfYear >= 1)
if (numericDates)
return "1 week ago"
else
return "last week"
else if (components.day >= 2)
return "\(components.day) days ago"
else if (components.day >= 1)
if (numericDates)
return "1 day ago"
else
return "yesterday"
else if (components.hour >= 2)
return "\(components.hour) hours ago"
else if (components.hour >= 1)
if (numericDates)
return "1 hour ago"
else
return "an hour ago"
else if (components.minute >= 2)
return "\(components.minute) minutes ago"
else if (components.minute >= 1)
if (numericDates)
return "1 minute ago"
else
return "a minute ago"
else if (components.second >= 3)
return "\(components.second) seconds ago"
else
return "just now"
我想重写这个函数(或者 - 如果更简单的话 - 创建另一个),它也接受一个 NSDate
作为参数,但这次输入日期是将来的,所以输出应该如下所示:
in couple minutes
、in couple hours
、in xx seconds
等
你能帮帮我吗?
【问题讨论】:
这似乎与您已经编写的逻辑相似。你被困在哪里了? 不是直接回答您的问题,但您是否考虑过使用NSDateComponentsFormatter
?它的功能与您的代码大致相同。
【参考方案1】:
如果你这样做,我会试图阻止你,因为你对编写这段代码特别感兴趣。但是,如果您只想要字符串结果并且正在编写代码作为达到此目的的一种手段——那么您可能想让自己的事情变得更容易并使用NSDateComponentsFormatter
。与您所描述的非常接近,适用于过去和未来的日期:
func diffString(date:NSDate) -> String
let now = NSDate()
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full
formatter.allowedUnits = [ .Day, .Hour, .Minute ]
let interval : NSTimeInterval = fabs(date.timeIntervalSinceDate(now))
guard let intervalString = formatter.stringFromTimeInterval(interval) else
return ""
let resultString : String
if now.timeIntervalSinceReferenceDate > date.timeIntervalSinceReferenceDate
resultString = "\(intervalString) ago"
else
resultString = "in \(intervalString)"
return resultString
你可以这样做:
let past = NSDate(timeIntervalSinceNow: -1000000)
let future = NSDate(timeIntervalSinceNow: 1000000)
diffString(past) // "11 days, 13 hours, 46 minutes ago"
diffString(future) // "in 11 days, 13 hours, 46 minutes"
更改格式化程序的allowedUnits
值以调整结果。
【讨论】:
以上是关于如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?的主要内容,如果未能解决你的问题,请参考以下文章