0

I'm looking to call a function that checks time elapsed since date. This will determine how the timeLable displays in my messages view controller, similar to IMessage.

The code I'm using below only shows HH:MM

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

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

I'm looking to change it to something along the lines of:

  • If date is today, date = "HH:MM"
  • If date is Yesterday, date = "Yesterday"
  • If date is the day before yesterday and so on, date = "Monday, Tuesday, Wednesday..."
  • If date is over 1 week, date = MM/DD/YY
Code Different
  • 90,614
  • 16
  • 144
  • 163
  • Take a look at NsCalendar, specifically https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/#//apple_ref/occ/instm/NSCalendar/components:fromDate:toDate:options: – David Berry Jun 13 '16 at 15:28
  • 3
    `(recent["date"] as? String)!` this makes me cry. – EmilioPelaez Jun 13 '16 at 16:31
  • Possible duplicate of [Human friendly date descriptions with NSDate on iOS](http://stackoverflow.com/questions/6332298/human-friendly-date-descriptions-with-nsdate-on-ios) – kennytm Jun 13 '16 at 16:39

2 Answers2

1

Or try this. Note that we have to use components:fromDate: and then use components:fromDateComponents:toDateComponents:options: because if we don't 23:59 last night returns 23:59 instead of Yesterday.

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)
        }
    }
}

Now then, to use it just:

timeLabel.text = NSDateFormatter.friendlyStringForDate(date!)
David Berry
  • 40,941
  • 12
  • 84
  • 95
0

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 ""
    }
}
Yaroslav Dukal
  • 3,894
  • 29
  • 36