ios开发中,我们经常要处理从服务器获取的时间。类似朋友圈,微博这些应用。我们经常可以看到“刚刚”,“31分钟前发表”,“昨天5点”,之类的字样。
当时我们从服务器端获取的都是那条朋友圈信息,或者微博的创建时间。所以我们每次显示数据的时候,都需要根据跟当前的时间做对比,按照格式,算出
我们想要的结果。
例如,我们从服务器获取的时间,大概都类似于 Sun May 24 12:12:00 +0800 2015
我们还是先详细说明一下 日期格式 吧
理解完上面的知识之后,我们就可以写代码了。预先制定一下需求吧
刚刚 ( 一分钟内 )
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()