ios开发中,我们经常要处理从服务器获取的时间。类似朋友圈,微博这些应用。我们经常可以看到“刚刚”,“31分钟前发表”,“昨天5点”,之类的字样。
当时我们从服务器端获取的都是那条朋友圈信息,或者微博的创建时间。所以我们每次显示数据的时候,都需要根据跟当前的时间做对比,按照格式,算出
我们想要的结果。
例如,我们从服务器获取的时间,大概都类似于 Sun May 24 12:12:00 +0800 2015
我们还是先详细说明一下日期格式吧
- 年
- y 将年份 (0-9) 显示为不带前导零的数字
- yy 以带前导零的两位数字格式显示年份
- yyy 以四位数字格式显示年份
- yyyy 以四位数字格式显示年份
- 月
- M 将月份显示为不带前导零的数字(如一月表示为 1)
- MM 将月份显示为带前导零的数字(例如 01/12/01)
- MMM 将月份显示为缩写形式(例如 Jan)
- MMMM 将月份显示为完整月份名(例如 January)
- 一月 Jan January
- 二月 Feb February
- 三月 Mar March
- 四月 Apr April
- 五月 May May
- 六月 Jun June
- 七月 Jul July
- 八月 Aug August
- 九月 Sep September
- 十月 Oct October
- 十一月 Nov November
- 十二月 Dec December
- 日
- d 将日显示为不带前导零的数字(如 1)
- dd 将日显示为带前导零的数字(如 01)
- 星期
- EEE 将日显示为缩写形式(例如 Sun)
- EEEE 将日显示为全名(例如 Sunday)
- 星期一 Mon Monday
- 星期二 Tue Tuesday
- 星期三 Wed Wednesday
- 星期四 Thu Thursday
- 星期五 Fri Friday
- 星期六 Sat Saturday
- 星期天 Sun Sunday
- 小时
- h 使用 12 小时制将小时显示为不带前导零的数字(例如 1:15:15 PM)
- hh 使用 12 小时制将小时显示为带前导零的数字(例如 01:15:15 PM)
- H 使用 24 小时制将小时显示为不带前导零的数字(例如 1:15:15)
- HH 使用 24 小时制将小时显示为带前导零的数字(例如 01:15:15)
- 分钟
- m 将分钟显示为不带前导零的数字(例如 12:1:15)
- mm 将分钟显示为带前导零的数字(例如 12:01:15)
- 秒
- s 将秒显示为不带前导零的数字(例如 12:15:5)
- ss 将秒显示为带前导零的数字(例如 12:15:05)
- f 显示秒的小数部分
- ff 将精确显示到百分之一秒
- ffff 将精确显示到万分之一秒
- 用户定义格式中最多可使用七个 f 符号
- 上午&下午
- t 使用 12 小时制
- 中午之前任一小时显示大写的 A
- 中午到 11:59 PM 之间的任一小时显示大写的 P
- tt 对于使用 12 小时制的区域设置
- 中午之前任一小时显示大写的 AM
- 中午到 11:59 PM 之间的任一小时显示大写的 PM
- 对于使用 24 小时制的区域设置,不显示任何字符
- 时区
- z 显示不带前导零的时区偏移量
- zz 显示带前导零的时区偏移量(例如 -08)
- zzz 显示完整的时区偏移量(例如 -0800)
- 纪元
- gg 显示时代/纪元字符串(例如 A.D.)
理解完上面的知识之后,我们就可以写代码了。预先制定一下需求吧
刚刚(一分钟内)
X分钟前(一小时内)
X小时前(当天)
昨天 HH:mm(昨天)
MM-dd(当年)
yyyy-MM-dd HH:mm(更早期)
第一步:我们一个日期NSDate的分类,然后先写一个类方法,将从服务器的时间数据转成NSDate(代码继续用swift练练)
我们先按照“ Sun May 24 12:12:00 +0800 2015”这个格式举例
1 ///使日期字符串 创建NSDate 2 class func createDate(fullDateString:String)->NSDate?{ 3 4 //创建fomater 5 let ft = NSDateFormatter() 6 //设置本地化 7 // 2. 要指定日期的地区,Xcode 6.3 beta 还不需要,地区需要指定英语 8 // 注意:在真机调试的时候,一定要指定区域,否则以前版本同样无法转换 9 ft.locale = NSLocale(localeIdentifier: "en") 10 11 //设置日期格式 12 ft.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" 13 14 //生成日期 15 return ft.dateFromString(fullDateString) 16 }
第二步:再在NSDate分类中创建对象方法(函数),正式处理时间, 里面要用到NSCalendar类(日历)
func fullDescription()->String{ //用日历类获得当前的日期 let calendar = NSCalendar.currentCalendar() //创建datefomater let ft = NSDateFormatter() //当天 if calendar.isDateInToday(self){ //获取日期与当前时间的差值 let delta = Int(NSDate().timeIntervalSinceDate(self)) if delta < 60 { return "刚刚" } if delta < 3600{ return "\(delta/60)分钟前" } return "\(delta/3600)小时前" } //昨天 if calendar.isDateInYesterday(self){ ft.dateFormat = "昨天 HH:mm" return ft.stringFromDate(self) } //计算年度差值 let coms = calendar.components(NSCalendarUnit.CalendarUnitYear, fromDate: NSDate(), toDate: self, options: NSCalendarOptions(0)) //今年 if coms.year == 0 { ft.dateFormat = "MM-dd" return ft.stringFromDate(self) } //剩下的都是往年了 ft.dateFormat = "yyyy-MM-dd HH:mm" return ft.stringFromDate(self) }
第三步:上面两个方法都写完之后,每次只要调用即可获得想要的数据了
想要的数据 = NSDate.createDate("服务器记录的创建时间").fullDescription()