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

微博 时间&来源 格式化

微博来源格式化

  • 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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,431评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,637评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,555评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,900评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,629评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,976评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,976评论 3 448
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,139评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,686评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,411评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,641评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,129评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,820评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,233评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,567评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,362评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,604评论 2 380

推荐阅读更多精彩内容