iOS 实用计算机技术一锅炖深入浅出iOS

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

2016-12-05  本文已影响858人  codychen123
仿朋友圈、微博时间.png 微博时间.png

前言

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

OC

主要代码及思路

/** 获取到的时间字符串转成NSDate */
+ (NSDate * )timeStringToDate: (NSString *)timeString;
/** 把NSDate转成自己需要的时间格式 */
- (NSString *)dateToRequiredString;

/** calender单例 */
+ (instancetype)sharedCalender;

/** formatter单例 */
+ (instancetype)sharedFormatter;
+ (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

//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

工具类地址

上一篇 下一篇

猜你喜欢

热点阅读