美文网首页iOS 实用计算机技术一锅炖深入浅出iOS
iOS 时间处理(仿朋友圈、微博发布时间)

iOS 时间处理(仿朋友圈、微博发布时间)

作者: codychen123 | 来源:发表于2016-12-05 17:28 被阅读858次
    仿朋友圈、微博时间.png 微博时间.png

    前言

    我们有时候做项目从网络回调的时间数据并不是我们想要的类型,而是,这种格式的Sat Dec 03 19:56:38 +0800 2016,而我们需要转成我们需要的时间例如: xx分钟前/xx小时前/xx天前

    OC

    主要代码及思路

    • 建立NSDate的分类,创建两个方法一个返回NSDate,一个返回我们需要的时间格式
    /** 获取到的时间字符串转成NSDate */
    + (NSDate * )timeStringToDate: (NSString *)timeString;
    /** 把NSDate转成自己需要的时间格式 */
    - (NSString *)dateToRequiredString;
    
    • 方法的实现,因为会用到NSDateFormatterNSCalendar这两个类,而这两个类初始化的时候会非常耗时间,并且我们可能在不同的模块都会用到处理过后的时间,所以创建成单例
    
    /** 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的一致,把DateFormatterCalendar定义成全局常量,这样在哪里访问到的都是同一个常量,和方法写在同一个文件,总共一个文件搞定
    //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

    工具类地址

    相关文章

      网友评论

      本文标题:iOS 时间处理(仿朋友圈、微博发布时间)

      本文链接:https://www.haomeiwen.com/subject/vzvkmttx.html