如何重写我的 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 minutesin couple hoursin 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 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?的主要内容,如果未能解决你的问题,请参考以下文章

重写Haskell树会离开函数,以便它给出计算步骤及其结果

如何在 Swift 中重写这段代码? [关闭]

Swift / SpriteKit:如何创建水滴效果?

Swift2.0 Multipeer Connectivity 无法连接

如何在swift中将数字附加到double

如何在 Swift 中打开邮件面板?苹果系统