美文网首页
11-微博 时间&来源 格式化

11-微博 时间&来源 格式化

作者: 月下独酌灬 | 来源:发表于2016-05-29 20:22 被阅读88次

微博 时间&来源 格式化

微博来源格式化

  • HMStatusViewModel 添加存储型属性 sourceText
/// 来源字符串,存储型属性
var sourceText: String?
  • 添加方法 dealSourceText 处理来源字符串的逻辑
/// 处理来源字符串
private func dealSourceText(){
    guard let source = status?.source else {
        return
    }
//        <a href="http://weibo.com" rel="nofollow">新浪微博</a>

    if let preRange = source.rangeOfString("\">") {
        if let sufRange = source.rangeOfString("</") {
            sourceText = "来自 \(source.substringWithRange(preRange.endIndex..<sufRange.startIndex))"
        }
    }
}
  • 在 init 函数中执行此方法
/// 构造函数
init(status: HMStatus){
    super.init()
    self.status = status
    ...
    // 处理来源的字符串
    dealSourceText()
}

运行测试

时间格式化

显示逻辑

  • 如果是今年
    • 是今天
      • 1分钟之内
        • 显示 "刚刚"
      • 1小时之内
        • 显示 "xx分钟前"
      • 其他
        • 显示 "xx小时前"
    • 是昨天
      • 显示 "昨天 HH:mm"
    • 其他
      • 显示 "MM-dd HH:mm"
  • 不是今年
    • 显示 "yyyy-MM-dd"

步骤

  • 将系统返回的字符串转 NSDate
  • 使用 NSCalendar 对象计算 今年今天昨天
  • 根据具体逻辑格式化具体字符串

代码实现

  • HMStatusViewModel 添加 计算 型属性 createAtText
/// 创建时间
var createAtText: String?
  • 添加处理时间字串的方法
/// 处理创建时间的逻辑
private func dealCreateAtText(create_at: String) -> String? {

    /// 判断是否是今年
    func isDateInThisYear(targetDate: NSDate) -> Bool {
        let calendar = NSCalendar.currentCalendar()
        let comp = calendar.components(.Year, fromDate: targetDate, toDate: NSDate(), options: [])
        return comp.year < 1
    }

    // Tue May 31 17:46:55 +0800 2011
    // 初始化时间格式化器
    let dateFormatter = NSDateFormatter()
    // 指定格式化字符串
    dateFormatter.dateFormat = "EEE MM dd HH:mm:ss z yyyy"
    dateFormatter.locale = NSLocale(localeIdentifier: "en")

    // 微博创建时间 `NSDate` 类型
    let createDate = dateFormatter.dateFromString(create_at)!

    // 获取当前
    let calendar = NSCalendar.currentCalendar()

    // 如果是今年
    if isDateInThisYear(createDate) {
        // 如果是今天
        if calendar.isDateInToday(createDate){
            // 计算两个时间的差值
            let timeInterval = Int(NSDate().timeIntervalSinceDate(createDate))

            if timeInterval < 60 {
                return "刚刚"
            }else if timeInterval < 3600 {
                return "\(timeInterval / 60)分钟前"
            }else{
                return "\(timeInterval / 3600)小时前"
            }

        }else if calendar.isDateInYesterday(createDate){
            // 如果是昨天
            dateFormatter.dateFormat = "昨天 HH:mm"
            return dateFormatter.stringFromDate(createDate)
        }else{
            // 其他
            dateFormatter.dateFormat = "MM-dd HH:mm"
            return dateFormatter.stringFromDate(createDate)
        }
    }else{
        // 不是今年
        dateFormatter.dateFormat = "yyyy-MM-dd"
        return dateFormatter.stringFromDate(createDate)
    }
}
  • createAtTextget 里面返回值 (计算型属性)
/// 创建时间
var createAtText: String? {
    return dealCreateAtText(status!.created_at!)
}
  • HMStatusOriginalViewstatusViewModel 的 didSet 方法里面设置数据
timeLabel.text = statusViewModel?.createAtText
sourceLabel.text = statusViewModel?.sourceText

代码抽取

  • 抽取获取新浪时间的方法到 NSDate+Extension.swift
/// 获取新浪时间
class func sinaDate(string: String) -> NSDate? {
    // 求出创建时间
    let dateformatter = NSDateFormatter()
    // Tue May 31 17:46:55 +0800 2011
    dateformatter.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
    dateformatter.locale = NSLocale(localeIdentifier: "en_US")
    let dt = dateformatter.dateFromString(string)
    return dt
}
  • 抽取时间具体字符串逻辑
var dateDescription: String {
    // 取出当前日历 - 提供了大量的日历相关的操作函数
    let calendar = NSCalendar.currentCalendar()
    /**
    是今年:
        是今天:
            1分钟内:
                刚刚
            1小时内:
                xx分钟前
            其他:
                xx小时前
        是昨天:
            昨天 HH:mm:ss
        其他:
            MM-dd HH:mm:ss

    不是今年:
        yyyy-MM-dd HH:mm

    */
    var fmt = "yyyy-MM-dd HH:mm"
    if isDateInThisYear(self) {
        if calendar.isDateInToday(self) {
            let currentDate = NSDate()
            // 取当前时间与微博时间的差值
            let result = currentDate.timeIntervalSinceDate(self)

            if result > 60 {
                if result < 60 * 60 {
                    // xx 分钟前
                    return "\(Int(result/60))分钟前"
                }else {
                    // xx 小时前
                    return "\(Int(result/(60*60)))小时前"
                }
            }else {
                return "刚刚"
            }
        }else if calendar.isDateInYesterday(self) {
            fmt = "昨天 HH:mm:ss"
        }else{
            fmt = "MM-dd HH:mm:ss"
        }
    }
    let df = NSDateFormatter()
    df.locale = NSLocale(localeIdentifier: "en_US")
    df.dateFormat = fmt
    return df.stringFromDate(self)
}

/// 判断是否是今年
///
/// - parameter date: 目标时间
private func isDateInThisYear(date: NSDate) -> Bool {

    // 取到当前时间
    let currentDate = NSDate()
    // 初始化时间格式化器
    let df = NSDateFormatter()
    // 指定格式
    df.dateFormat = "yyyy"
    // 格式当前时间与目标时间成字符串
    let currentDateString = df.stringFromDate(currentDate)
    let dateString = df.stringFromDate(date)
    // 对比字符串是否相同
    return (currentDateString as NSString).isEqualToString(dateString)
}
  • 调用
// 创建时间
var createAtText: String? {
    return NSDate.sinaDate(status?.created_at ?? "")?.dateDescription
}

相关文章

网友评论

      本文标题:11-微博 时间&来源 格式化

      本文链接:https://www.haomeiwen.com/subject/onyqdttx.html