美文网首页
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