新浪微博的微博内容显示的发表时间如示例图1所示,从服务器获取到的微博发表时间数据其实是如示例图2所示,这时就需要对获取到的发表时间数据进行重写get方法。在进行重写get方法时涉及到对时间数据的转换,转换方法较为典型,因此可以将转换方法封装为继承NSDate的一个转换类方法,方便以后使用。
具体的创建过程详见文章《利用Category创建类的方法,快速修改frame,提高编程效率》
(1)NSDate+SHKExtension.h
#import<Foundation/Foundation.h>
@interface NSDate (SHKExtension)
//判断某个时间是否为今年
- (BOOL)isThisYear;
//判断某个时间是否为昨天
- (BOOL)isYesterday;
//判断某个时间是否为今天
-(BOOL)isToday;
@end
(2)NSDate+SHKExtension.m
#import "NSDate+SHKExtension.h"
@implementation NSDate (SHKExtension)
-(BOOL)isThisYear{
NSCalendar *calendar=[NSCalendar currentCalendar];
//获得某个时间的年月日时分秒
NSDateComponents *dateCmps=[calendar components:NSCalendarUnitYear fromDate:self];
NSDateComponents *nowCmps=[calendar components:NSCalendarUnitYear fromDate:[NSDate date]];
return dateCmps.year==nowCmps.year;
}
//判断某个时间是否为昨天
-(BOOL)isYesterday{
NSDate *now=[NSDate date];
// date == 2014-04-30 10:05:28 --> 2014-04-30 00:00:00
// now == 2014-05-01 09:22:10 --> 2014-05-01 00:00:00
NSDateFormatter *fmt=[[NSDateFormatter alloc]init];
fmt.dateFormat=@"yyyy-MM-dd";
// 2014-04-30
NSString *dateStr=[fmt stringFromDate:self];
// 2014-10-18
NSString *nowStr=[fmt stringFromDate:now];
// 2014-10-30 00:00:00
NSDate *date=[fmt dateFromString:dateStr];
// 2014-10-18 00:00:00
now=[fmt dateFromString:nowStr];
NSCalendar *calendar=[NSCalendar currentCalendar];
NSCalendarUnit unit=NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *cmps=[calendar components:unit fromDate:date toDate:now options:0];
return cmps.year==0&&cmps.month==0&&cmps.day==1;
}
-(BOOL)isToday{
NSDate *now=[NSDate date];
NSDateFormatter *fmt=[[NSDateFormatter alloc]init];
fmt.dateFormat=@"yyyy-MM-dd";
NSString *dateStr=[fmt stringFromDate:self];
NSString *nowStr=[fmt stringFromDate:now];
return [dateStr isEqualToString:nowStr];
}
@end
(3)类方法的使用示例
//重写get方法
-(NSString *)created_at{
//日期格式化类
NSDateFormatter *fmt=[[NSDateFormatter alloc]init];
// 如果是真机调试,转换欧美时间,需要设置locale
fmt.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
fmt.dateFormat=@"EEE MMM dd HH:mm:ss Z yyyy";
//微博的创建日期
NSDate *createDate=[fmt dateFromString:_created_at];
//当前时间
NSDate *now=[NSDate date];
//日历对象(比较日期之间的差距)
NSCalendar *calendar=[NSCalendar currentCalendar];
// NSCalendarUnit枚举代表想获得哪些差值
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
//计算两个日期之间的差值
NSDateComponents *cmps=[calendar components:unit fromDate:createDate toDate:now options:0];
if ([createDate isThisYear]) {//今年
if ([createDate isYesterday]) {//昨天
fmt.dateFormat=@"昨天 HH:mm";
return [fmt stringFromDate:createDate];
}else if([createDate isToday]){//今天
if (cmps.hour>=1) {
return [NSString stringWithFormat:@"%d小时前",cmps.hour];
}else if (cmps.minute>=1){
return [NSString stringWithFormat:@"%d分钟前",cmps.minute];
}else{
return @"刚刚";
}
}else{//今年的其他日子
fmt.dateFormat=@"MM-dd HH:mm";
return [fmt stringFromDate:createDate];
}
}else{//非今年
fmt.dateFormat=@"yyyy-MM-dd HH:mm";
return [fmt stringFromDate:createDate];
}
}
小结
以上方法是针对近期自学新浪微博项目的一点小小总结,行笔简陋,如有错误,望指正。
"彩蛋":循环着这首《Prayer In C》写完的这篇文章,这首本来是很普通和典型的独立音乐曲调的歌,之后被一位德国DJ Robin Schulz重新制作后引起了轰动,曾获多国榜单冠军单曲。