时间业务逻辑需求
- 如果是今年
- 如果是今天
- 如果小于60秒 显示格式: 刚刚
- 如果 s >= 60 && s < 6060 显示格式: xx分钟前
- 如果 s >= 6060 显示格式: 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