
仿朋友圈、微博时间.png

微博时间.png
前言
我们有时候做项目从网络回调的时间数据并不是我们想要的类型,而是,这种格式的 Sat Dec 03 19:56:38 +0800 2016 ,而我们需要转成我们需要的时间 例如: xx分钟前/xx小时前/xx天前OC
主要代码及思路
- 建立NSDate的分类,创建两个方法一个返回NSDate,一个返回我们需要的时间格式
/** 获取到的时间字符串转成NSDate */ + (NSDate * )timeStringToDate: (NSString *)timeString; /** 把NSDate转成自己需要的时间格式 */ - (NSString *)dateToRequiredString;
- 方法的实现,因为会用到 NSDateFormatter 和 NSCalendar 这两个类,而这两个类初始化的时候会非常耗时间,并且我们可能在不同的模块都会用到处理过后的时间,所以创建成单例
/** calender单例 */ + (instancetype)sharedCalender; /** formatter单例 */ + (instancetype)sharedFormatter;
- NSDate的方法:
1.返回NSDate
+ (NSDate *)timeStringToDate: (NSString *)timeString {
/** /// "Sat Dec 03 19:56:38 +0800 2016",根据回调的时间字符串制定不一样的日期格式 */
NSString * formatterString = @"EEE MMM dd HH:mm:ss zzz yyyy";
/** DateFormatter, Calendar初始化比较消耗内存, 定义成单例 */
[HHDateFormatter sharedFormatter].dateFormat = formatterString;
/** 指定区域,真机一定要指定 */
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] dateFromString: timeString];
} 2.返回需要的时间格式,使用NSCalender的方法进行判断 - (NSString *)dateToRequiredString {
if ([[HHCalender sharedCalender] isDateInToday:self]) {
//如果是今天
int seconds = [[NSDate date] timeIntervalSinceDate:self];
if (seconds < 60) {
return @"刚刚";
} else if (seconds < 60 * 60) {
return [NSString stringWithFormat:@"%d分钟前", seconds / 60];
} else {
return [NSString stringWithFormat:@"%d小时前", seconds / 3600];
}
} else if ([[HHCalender sharedCalender] isDateInYesterday:self]) {
//如果是昨天 10: 10
[HHDateFormatter sharedFormatter].dateFormat = @"昨天 HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
} else {
//首先要取到今年是哪一年 2016
//再取到当前的date是哪一年, 再做比较
NSInteger thisYear = [[HHCalender sharedCalender] component:NSCalendarUnitYear fromDate: [NSDate date]];
NSInteger dateYear = [[HHCalender sharedCalender] component:NSCalendarUnitYear fromDate: self];
//是今年
if (thisYear == dateYear) {
[HHDateFormatter sharedFormatter].dateFormat = @"MM-dd HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
}
//往年
else {
[HHDateFormatter sharedFormatter].dateFormat = @"yyyy-MM-dd HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
}
}
} Swift
- 实现的思路与OC的一致,把 DateFormatter 和 Calendar 定义成全局常量,这样在哪里访问到的都是同一个常量,和方法写在同一个文件,总共一个文件搞定
//DateFormatter, Calendar初始化比较消耗内存,一般定义成常量
let dateFormat = DateFormatter()
let calendar = Calendar.current
extension Date {
/// 在Swift3.0中, 分类里面的类方法,需要使用 static
static func timeStringToDate(timeString: String) -> Date {
/// "Sat Dec 03 19:56:38 +0800 2016",根据回调的时间字符串制定不一样的日期格式
dateFormat.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
/// 指定区域,真机一定要指定
dateFormat.locale = Locale(identifier: "en")
/// 把时间字符串,转日期
return dateFormat.date(from: timeString)!
}
func dateToShowTime() -> String {
if calendar.isDateInToday(self) {
/// 间隔秒数
let timeInterval = Int(Date().timeIntervalSince(self))
/// 如果小于60秒
if timeInterval < 60 {
return "刚刚"
}
/// 小于1小时
if timeInterval < 60 * 60 {
return "/(timeInterval / 60)分钟前"
}
/// 小于1天,大于1小时
return "/(timeInterval / 3600)小时前"
}
/// 如果是昨天
if calendar.isDateInYesterday(self) {
dateFormat.dateFormat = "昨天 HH:mm "
} else {
/// 如果不是昨天
let year = calendar.component(.year, from: self)
let thisYear = calendar.component(.year, from: Date())
/// 如果是今年
if year == thisYear {
dateFormat.dateFormat = "MM-dd HH:mm"
} else {
dateFormat.dateFormat = "yyyy-MM-dd HH:mm"
}
}
dateFormat.locale = Locale(identifier: "en")
/// 返回需要的时间字符串
return dateFormat.string(from: self)
}
} 使用
NSString *timeString = @"Mon Dec 05 11:56:38 +0800 2016";
NSDate *timeDate = [NSDate timeStringToDate:timeString];
NSLog(@"--%@",timeDate);
NSString *requiredString = [timeDate dateToRequiredString];
NSLog(@"--%@",requiredString); 
控制台打印结果.png
收藏的用户(0) X
正在加载信息~
推荐阅读
iOS入门——View Controller 生命周期的各个方法的用法
最新回复 (0)
站点信息
- 文章2314
- 用户1336
- 访客11813325
每日一句
Let's seek joy in the simple, quiet moments.
让我们在简单宁静的时刻中寻找快乐。
让我们在简单宁静的时刻中寻找快乐。