2015-01-17 3 views
2

Попытка вывода нечеткой даты из следующих функций:Реализация Нечеткие Даты

import Foundation 

let kMinute = 60 
let kDay = kMinute * 24 
let kWeek = kDay * 7 
let kMonth = kDay * 31 
let kYear = kDay * 365 

func NSDateTimeAgoLocalizedStrings(key: String) -> String { 

    let resourcePath = NSBundle.mainBundle().resourcePath 
    let path = resourcePath?.stringByAppendingPathComponent("NSDateTimeAgo.bundle") 
    let bundle = NSBundle(path: path!) 

    return NSLocalizedString(key, tableName: "NSDateTimeAgo", bundle: bundle!, comment: "") 
} 

extension NSDate { 

    // shows 1 or two letter abbreviation for units. 
    // does not include 'ago' text ... just {value}{unit-abbreviation} 
    // does not include interim summary options such as 'Just now' 
    var timeAgoSimple: String { 

     let now = NSDate() 
     let deltaSeconds = Int(fabs(timeIntervalSinceDate(now))) 
     let deltaMinutes = deltaSeconds/60 

     var value: Int! 

     if deltaSeconds < kMinute { 
      // Seconds 
      return stringFromFormat("%%d%@s", withValue: deltaSeconds) 
     } else if deltaMinutes < kMinute { 
      // Minutes 
      return stringFromFormat("%%d%@m", withValue: deltaMinutes) 
     } else if deltaMinutes < kDay { 
      // Hours 
      value = Int(floor(Float(deltaMinutes/kMinute))) 
      return stringFromFormat("%%d%@h", withValue: value) 
     } else if deltaMinutes < kWeek { 
      // Days 
      value = Int(floor(Float(deltaMinutes/kDay))) 
      return stringFromFormat("%%d%@d", withValue: value) 
     } else if deltaMinutes < kMonth { 
      // Weeks 
      value = Int(floor(Float(deltaMinutes/kWeek))) 
      return stringFromFormat("%%d%@w", withValue: value) 
     } else if deltaMinutes < kYear { 
      // Month 
      value = Int(floor(Float(deltaMinutes/kMonth))) 
      return stringFromFormat("%%d%@mo", withValue: value) 
     } 

     // Years 
     value = Int(floor(Float(deltaMinutes/kYear))) 
     return stringFromFormat("%%d%@yr", withValue: value) 
    } 

    var timeAgo: String { 

     let now = NSDate() 
     let deltaSeconds = Int(fabs(timeIntervalSinceDate(now))) 
     let deltaMinutes = deltaSeconds/60 

     var value: Int! 

     if deltaSeconds < 5 { 
      // Just Now 
      return NSDateTimeAgoLocalizedStrings("Just now") 
     } else if deltaSeconds < kMinute { 
      // Seconds Ago 
      return stringFromFormat("%%d %@seconds ago", withValue: deltaSeconds) 
     } else if deltaSeconds < 120 { 
      // A Minute Ago 
      return NSDateTimeAgoLocalizedStrings("A minute ago") 
     } else if deltaMinutes < kMinute { 
      // Minutes Ago 
      return stringFromFormat("%%d %@minutes ago", withValue: deltaMinutes) 
     } else if deltaMinutes < 120 { 
      // An Hour Ago 
      return NSDateTimeAgoLocalizedStrings("An hour ago") 
     } else if deltaMinutes < kDay { 
      // Hours Ago 
      value = Int(floor(Float(deltaMinutes/kMinute))) 
      return stringFromFormat("%%d %@hours ago", withValue: value) 
     } else if deltaMinutes < (kDay * 2) { 
      // Yesterday 
      return NSDateTimeAgoLocalizedStrings("Yesterday") 
     } else if deltaMinutes < kWeek { 
      // Days Ago 
      value = Int(floor(Float(deltaMinutes/kDay))) 
      return stringFromFormat("%%d %@days ago", withValue: value) 
     } else if deltaMinutes < (kWeek * 2) { 
      // Last Week 
      return NSDateTimeAgoLocalizedStrings("Last week") 
     } else if deltaMinutes < kMonth { 
      // Weeks Ago 
      value = Int(floor(Float(deltaMinutes/kWeek))) 
      return stringFromFormat("%%d %@weeks ago", withValue: value) 
     } else if deltaMinutes < (kDay * 61) { 
      // Last month 
      return NSDateTimeAgoLocalizedStrings("Last month") 
     } else if deltaMinutes < kYear { 
      // Month Ago 
      value = Int(floor(Float(deltaMinutes/kMonth))) 
      return stringFromFormat("%%d %@months ago", withValue: value) 
     } else if deltaMinutes < (kDay * (kYear * 2)) { 
      // Last Year 
      return NSDateTimeAgoLocalizedStrings("Last Year") 
     } 

     // Years Ago 
     value = Int(floor(Float(deltaMinutes/kYear))) 
     return stringFromFormat("%%d %@years ago", withValue: value) 

    } 

    func stringFromFormat(format: String, withValue value: Int) -> String { 

     let localeFormat = String(format: format, getLocaleFormatUnderscoresWithValue(Double(value))) 

     return String(format: NSDateTimeAgoLocalizedStrings(localeFormat), value) 
    } 

    func getLocaleFormatUnderscoresWithValue(value: Double) -> String { 

     let localeCode = NSLocale.preferredLanguages().first as String 

     if localeCode == "fr" { 
      let XY = Int(floor(value)) % 100 
      let Y = Int(floor(value)) % 10 

      if Y == 0 || Y > 4 || (XY > 10 && XY < 15) { 
       return "" 
      } 

      if Y > 1 && Y < 5 && (XY < 10 || XY > 20) { 
       return "_" 
      } 

      if Y == 1 && XY != 11 { 
       return "__" 
      } 
     } 

     return "" 
    } 

} 

Теперь при вызове функции, как это:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var fuzzyDate: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     var dateNow = "Jan 17, 2015, 3:31 AM" 

     fuzzyDate.text = NSDateTimeAgoLocalizedStrings(dateNow) 
    } 

} 

Результат является «17 января 2015, 3: 31 AM "вместо" xx часов назад ". Что я делаю неправильно? Новичок здесь.

Спасибо!

ответ

2

Ваш код

var dateNow = "Jan 17, 2015, 3:31 AM" 
fuzzyDate.text = NSDateTimeAgoLocalizedStrings(dateNow) 

не делает нигде вызвать метод timeAgo, который вы определили. Он только локализует данную строку без каких-либо вычислений даты или времени.

Вы должны преобразовать String "Ян 17, 2015, 3:31 AM" в NSDate первым, используя форматирования даты:

var dateNow = "Jan 17, 2015, 3:31 AM" 
let fmt = NSDateFormatter() 
fmt.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
fmt.dateFormat = "MMM dd, yyyy, hh:mm a" 
let date = fmt.dateFromString(dateNow)! 

, а затем вы можете применить метод timeAgo к что дата получить "нечеткой строку":

fuzzyDate.text = date.timeAgo // Result: 8 hours ago 

Примечание: Все даты и времени расчеты, которые превышают диапазон часов должны лучше быть сделано с помощью NSCalendar и NSDateComponent методы, вместо «просто» деление на 60, 24, 7, 31 или 365. Причина в том, что есть дни с 23 или 25 часами (переход на летнее время ), так что не каждый день имеет 24 * 60 * 60 секунд. Также не каждый месяц имеет 31 день, а год может иметь 356 или 366 дней.

+0

Спасибо, Мартин ... работает как шарм. –

Смежные вопросы