时间处理

  • 时间业务逻辑需求
    - 如果是今年
    - 如果是今天
    - 如果小于60秒 显示格式: 刚刚
    - 如果 s >= 60 && s < 6060 显示格式: xx分钟前
    - 如果 s >= 60
    60 显示格式: xx小时前
    - 如果是昨天
    e.g. 2016-06-29 12:12:12 显示格式: 昨天 12:12
    - 如果是其他
    e.g. 2016-06-12 13:13:13 显示格式: 06月12日 13:13
    - 如果不是今年
    e.g. 2015-05-05 10:10:10 显示格式: 2015年05月05日 10:10

  • 按照上述要求,封装两个函数,一个用来判断是否是今年,这里传入的是参数为NSDate类型

    //判断是否是今年
    private func isThisYearOrNot (currentDate: NSDate) -> Bool {
        
        // 实例化一个格式化时间
        let formatterDate = NSDateFormatter()
        formatterDate.locale = NSLocale(localeIdentifier: "en_US")
        
        // 设置时间格式: 只取年
        formatterDate.dateFormat = "yyyy"
        let yearString = formatterDate.stringFromDate(currentDate)
        
        // 获取当前时间(String类型)
        let currentYearString = formatterDate.stringFromDate(NSDate())
        
        // 判断是否是今年 因为Swift中String是一个结构体,所以可以使用==进行判断,OC中==是地址判断
        if yearString == currentYearString { //是今年
            
            return true
            
        } else { // 不是今年
            
            return false
        }
        
    }

按照需求的时间格式返回时间(String类型)
参数和返回值均为String类型

 private func getFormatterTime (timeString: String) -> String {
        
        // 实例化一个格式化时间
        let formatterDate = NSDateFormatter()
        // 设置时间格式  //Thu Jun 30 15:21:04 +0800 2016    ---- +0800 时区 z
        formatterDate.dateFormat = "EEE MMM dd HH:mm:ss z yyy"
        // 设置地区 避免时间出错(模拟器上不会出现问题,真机上可能会出现事件错误,所以需要设置地区)
        formatterDate.locale = NSLocale(localeIdentifier: "en_US")
        // 将传递的字符串转换为自定义的格式化时间 因为传递的是一个必选项,所以这里强行解包,否则下面多处使用该参数还需要分别解包
        let originalDate = formatterDate.dateFromString(timeString)!
        
        // 判断事件输出格式: 是否是今年
        let isThisYear: Bool = isThisYearOrNot(originalDate)
        
        if isThisYear { // 是今年
            
            // 获取当前日历
            let calender = NSCalendar.currentCalendar()
            // 如果是今天
            if calender.isDateInToday(originalDate) { // 今天
                //获取差值
                let s = NSDate().timeIntervalSinceDate(originalDate)
                
                if s < 60 {
                    // 如果小于60秒  显示格式: 刚刚
                    return "刚刚"
                    
                } else if s >= 60 && s < 60*60 {
                    
                    // 显示格式: xx分钟前
                    return "\(Int(s/60))分钟前"
                    
                } else {
                    // 显示格式: xx小时前   NSTimeInterval类型是Double的别名,所以这里转成Int类型拼接返回
                    return "\(Int(s/3600))小时前"
                    
                }
                
            } else if calender.isDateInYesterday(originalDate) { // 昨天  显示格式: 昨天 12:12
                
                // 设置时间格式
                formatterDate.dateFormat = "昨天: HH:mm"
                return formatterDate.stringFromDate(originalDate)
                
            } else { //其他  显示格式: 06月12日 13:13
                
                // 设置时间格式
                formatterDate.dateFormat = "MM月dd日 HH:mm"
                return formatterDate.stringFromDate(originalDate)
                
            }
            
            
        } else { // 不是今年  显示格式: 2015年05月05日 10:10
            
            formatterDate.dateFormat = "yyyy年MM月dd日 HH:mm"
            let date = formatterDate.stringFromDate(originalDate)
            return date;
        }
        
    }

通过格式化时间将NSDate和String互转可以使用下面两个方法

func dateFromString(string: String) -> NSDate?
func stringFromDate(date: NSDate) -> String

你可能感兴趣的:(时间处理)