【问题标题】:NSDateFormatter. Setting time elapsed since date in swiftNSDateFormatter。快速设置自日期以来经过的时间
【发布时间】:2017-04-17 20:05:47
【问题描述】:

我希望调用一个函数来检查自日期以来经过的时间。这将决定 timeLable 在我的消息视图控制器中的显示方式,类似于 IMessage。

我在下面使用的代码只显示 HH:MM

let date = dateFormatter().dateFromString((recent["date"] as? String)!)

timeLabel.text = NSDateFormatter.localizedStringFromDate(date!, dateStyle: NSDateFormatterStyle.NoStyle, timeStyle: NSDateFormatterStyle.NoStyle)

我希望将其更改为以下内容:

  • 如果日期是今天,则 date = "HH:MM"
  • 如果日期是昨天,则 date = "昨天"
  • 如果 date 是前天等,则 date = "Monday, Tuesday, Wednesday..."
  • 如果日期超过 1 周,则日期 = MM/DD/YY

【问题讨论】:

标签: swift time nsdateformatter


【解决方案1】:

或者试试这个。请注意,我们必须使用components:fromDate:,然后使用components:fromDateComponents:toDateComponents:options:,因为如果我们不使用昨晚的 23:59,则会返回 23:59 而不是昨天。

extension NSDateFormatter {
    static func friendlyStringForDate(date:NSDate) -> String {
        // Fetch the default calendar
        let calendar = NSCalendar.currentCalendar()

        // Compute components from target date
        let from = calendar.components([.Day, .Month, .Year], fromDate: date)

        // Compute components from current date
        let to = calendar.components([.Day, .Month, .Year], fromDate: NSDate())

        // Compute days difference between the two
        let delta = calendar.components(.Day, fromDateComponents: from, toDateComponents: to, options: [])

        switch delta.day {
        case 0:
            let formatter = NSDateFormatter()
            formatter.timeZone = NSTimeZone.defaultTimeZone()
            formatter.dateFormat = "HH:mm"
            return formatter.stringFromDate(date)

        case 1:
            return "Yesterday"

        case 2..<7:
            let formatter = NSDateFormatter()
            formatter.timeStyle = .NoStyle
            formatter.dateFormat = "EEEE"
            return formatter.stringFromDate(date)

        default:
            let formatter = NSDateFormatter()
            formatter.timeStyle = .NoStyle
             formatter.dateFormat = "MM/dd/YY"
            return formatter.stringFromDate(date)
        }
    }
}

那么,就用它吧:

timeLabel.text = NSDateFormatter.friendlyStringForDate(date!)

【讨论】:

    【解决方案2】:

    SWIFT 3:

    extension DateFormatter {
    
        static func friendlyStringForDate(date: Date) -> String {
            // Fetch the default calendar
            let calendar = Calendar.current
            let unitFlags: NSCalendar.Unit = [.day]
    
            // Compute days difference between the two
            let delta = (calendar as NSCalendar).components(unitFlags, from: date, to: Date(), options: [])
    
            if let day = delta.day {
    
                switch day {
                case 0:
                    let formatter = DateFormatter()
                    formatter.timeZone = NSTimeZone.default
                    formatter.dateFormat = "hh:mm a"
                    return formatter.string(from: date)
    
                case 1:
                    return "Yesterday"
    
                case 2..<7:
                    let formatter = DateFormatter()
                    formatter.timeStyle = .none
                    formatter.dateFormat = "EEEE"
                    return formatter.string(from: date)
    
                default:
                    let formatter = DateFormatter()
                    formatter.timeStyle = .none
                    formatter.dateFormat = "MM/dd/YY"
                    return formatter.string(from: date)
                }
            }
            return ""
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2011-02-24
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多