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

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

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

时间未处理处理之前:

Snip20160404_2.png

时间经过处理之后:

Snip20160404_1.png


-1 OC版的时间处理

  • 服务器返回的格式: 2017-01-13 18:58:02
################################ .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;
    }
}
  • 注意:时间的格式要根据服务器返回的时间类型,要不然会转换失败

    • 日期格式化 根据服务器返回的时间类型确定
      fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

  • 2 Swift2.2版的时间处理

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()
  }


  • 3 Swift3.x版的时间处理

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)
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容