项目以及封装MG的Swift空间MG的分类和继承

MG--NSDate服务器返回时间的处理

2016-04-04  本文已影响644人  Mg明明就是你

OC和Swift的NSDate时间的简单整理:

+(我们通过网络数据请求获得的时间是不能直接显示到客户端的,必须经过处理。用到的时候一般都会配合分类来使用,如先判断是否为今年,今天,昨天等,在进行时间差的比较。为了代码的封装性和易用性。我们通常把比较时间差代码封装到分类,这些都是已经封装好的代码。详情请看下面:)

时间未处理处理之前:

Snip20160404_2.png

时间经过处理之后:

Snip20160404_1.png

-1 OC版的时间处理

################################ .h文件 ##################################
//  NSDate+MGExtension.h
//  Created by ming on 14/11/25.
//  Copyright © 2014年 ming. All rights reserved.

#import <Foundation/Foundation.h>
@interface NSDate (MGExtension)
/**
 * 比较self和from时间的差值
 * 返回一个NSDateComponents:包括年月日时分秒
 */
- (NSDateComponents *)mg_deltaFrom:(NSDate *)from;

/**
 * 是否为今年
 */
- (BOOL)mg_isThisYear;

/**
 * 是否为今天
 */
- (BOOL)mg_isToday;

/**
 * 是否为昨天
 */
- (BOOL)mg_isYesterday;

@end


################################ .m文件 ##################################
//  NSDate+MGExtension.m
//  Created by ming on 14/11/25.
//  Copyright © 2014年 ming. All rights reserved.
/**
 * 这是一个处理时间的分类(用于计算服务器返回的时间与当前时间比较)
 * 分为:
 *      今年 非今年
 *      今天 昨天  明天
 *      几小时前 几分钟前 一分钟以内
 */

#import "NSDate+MGExtension.h"

@implementation NSDate (MGExtension)

- (NSDateComponents *)mg_deltaFrom:(NSDate *)from{
    // 获取日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    // 比较时间
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    
    return [calendar components:unit fromDate:from toDate:self options:0];
}

/** 是否是今年 */
- (BOOL)mg_isThisYear{
    // 获取日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    // 比较时间
    NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
    NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
    
    // NSInteger之间的比较
    return nowYear == selfYear;
}

/** 是否是今天 */
- (BOOL)mg_isToday{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSString *nowString = [fmt stringFromDate:[NSDate date]];
    NSString *selfString = [fmt stringFromDate:self];
    
    // 字符串之间的比较
    return [nowString isEqualToString:selfString];
//    return [nowString isEqual:selfString];
}

/** 是否是昨天 */
- (BOOL)mg_isYesterday{
    // 去除掉时分秒
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
    
    NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
    NSCalendarUnitDay;
    NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
    return coms.year == 0
    && coms.month == 0
    && coms.day == 1;
}

/** 是否是明天  (注:这个只是扩展,实际开发不会用到是否是明天的) */
- (BOOL)mg_isTomorrow{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
    
    NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
    NSCalendarUnitDay;
    NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
    return coms.year == 0
    && coms.month == 0
    && coms.day == -1;
}
@end

外部调用(OC)

/**
*  拿到服务器返回的时间和当前时间进行比较
*  返回一个字符串时间
*/
- (NSString *)created_at{
    // 1.创建NSDateFormatter对象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 1.1并日期格式化
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // 1.2拿到服务器返回的时间
    NSDate *creat = [fmt dateFromString:_created_at];
    
    // 2.判断服务器返回的时间
    if (creat.mg_isThisYear) {          // 今年
        if (creat.mg_isToday) {         // 今天
            NSDateComponents *coms = [[NSDate date] mg_deltaFrom:creat];
            if (coms.hour > 1) {        // 几小时前
                return [NSString stringWithFormat:@"%zd小时前",coms.hour];
            }else if (coms.minute > 1){ // 几分钟前
                return [NSString stringWithFormat:@"%zd分钟前",coms.minute];
            }else{                      // 刚刚
                return @"刚刚";
            }
        }else if (creat.mg_isYesterday){// 昨天
            fmt.dateFormat = @"昨天 HH:mm:ss";
            return [fmt stringFromDate:creat];
        }else{                          // 今年其他日子
            fmt.dateFormat = @"MM-dd HH:mm:ss";
            return [fmt stringFromDate:creat];
        }
    }else{                              // 非今年
        return _create_time;
    }
}

NSDate+Extension.swift

    Created by ming on 16/2/1.
    Copyright © 2016年 ming. All rights reserved.

   import UIKit
   extension NSDate {
    /**
    *  根据字符串转换时间
    */
    class func dateWithString(str: String) -> NSDate? {
        // 1.创建时间格式化对象
        let formatter = NSDateFormatter()
        // 2.指定时间格式
        formatter.dateFormat = "EEE MM dd HH:mm:ss Z yyyy"
        // 3.指定时区
        formatter.locale = NSLocale(localeIdentifier: "en")
        // 4.转换时间
        return formatter.dateFromString(str)
    }
    
    /**
    *   获取当前时间的格式
    *   返回一个字符串时间
    */
    func desStr() -> String{
        // 0.1.创建一个日历类
        let calendar = NSCalendar.currentCalendar()
        
        // 0.2.利用日历类从指定时间从获取指定的组成成分
  
        // 1.1.创建时间格式化对象
        let formatter = NSDateFormatter()

        // 1.2.指定时区
        formatter.locale = NSLocale(localeIdentifier: "en")
        
        if calendar.isDateInToday(self){ // 2.1判断是否是今天
            // 获取当前时间与指定时间的差值
            let res = Int(NSDate().timeIntervalSinceDate(self))
            
            if res < 60 {  // 刚刚
                return "刚刚"
            }else if res < 60 * 60 {  // 多少分钟前
                return "\(res/60)分钟前"
            }else if res < 24 * 60 * 60 { // 多少小时前
                return "\(res/(60*60))小时前"
            }
        }else if calendar.isDateInYesterday(self){ // 2.2判断是否是昨天
            formatter.dateFormat = "昨天 HH:mm"
            return formatter.stringFromDate(self)
        }

        /// 如果能来到这里,肯定不是今天或者昨天        
        let comps = calendar.components(NSCalendarUnit.Year, fromDate: self, toDate: NSDate(), options: NSCalendarOptions(rawValue:0))
        
        if comps.year < 1 { // 2.3一年以内
            formatter.dateFormat = "MM-dd HH:mm"
            return formatter.stringFromDate(self)
        }else{ // 2.4更早时间
            formatter.dateFormat = "yyyy-MM-dd HH:mm"
            return formatter.stringFromDate(self)
        }
    }
}

外部调用(Swift)

// 设置以及处理过的时间
   var timeText: String?
 {
        // 守卫
        guard let timeStr = status?.created_at else{
            return "" 
        }
        guard let date = NSDate.dateWithString(timeStr) else {
            return ""
        }
        return date.desStr()
  }


extension Date {
    /**
     *  根据字符串转换时间
     */
    static func dateWithString(str: String) -> Date? {
        // 1.创建时间格式化对象
        let formatter = DateFormatter()
        // 2.指定时间格式
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 3.指定时区
        formatter.locale = Locale(identifier: "en")
        // 4.转换时间
        return formatter.date(from: str)
    }
    
    /**
     *   获取当前时间的格式
     *   返回一个字符串时间
     */
    func desStr() -> String{
        // 0.1.创建一个日历类
        let calendar = NSCalendar.current
        
        // 0.2.利用日历类从指定时间从获取指定的组成成分
        
        // 1.1.创建时间格式化对象
        let formatter = DateFormatter()
        
        // 1.2.指定时区
        formatter.locale = Locale(identifier: "en") //Locale(identifier: "en")
        
        
        if calendar.isDateInToday(self){ // 2.1判断是否是今天
            // 获取当前时间与指定时间的差值
            let res = Int(Date().timeIntervalSince(self))
            
            if res < 60 {  // 刚刚
                return "刚刚"
            }else if res < 60 * 60 {  // 多少分钟前
                return "\(res/60)分钟前"
            }else if res < 24 * 60 * 60 { // 多少小时前
                return "\(res/(60*60))小时前"
            }
        }else if calendar.isDateInYesterday(self){ // 2.2判断是否是昨天
            formatter.dateFormat = "昨天 HH:mm"
            return formatter.string(from: self)
        }
        
        /// 如果能来到这里,肯定不是今天或者昨天
        let comps = calendar.dateComponents([.year], from: self, to:  Date())
        
    
        if comps.year! < 1 { // 2.3一年以内
            formatter.dateFormat = "MM-dd HH:mm"
            return formatter.string(from: self)
        }else{ // 2.4更早时间
            formatter.dateFormat = "yyyy-MM-dd HH:mm"
            return formatter.string(from: self)
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读