MG--NSDate服務(wù)器返回時間的處理

OC和Swift的NSDate時間的簡單整理:

+(我們通過網(wǎng)絡(luò)數(shù)據(jù)請求獲得的時間是不能直接顯示到客戶端的住闯,必須經(jīng)過處理懒棉。用到的時候一般都會配合分類來使用,如先判斷是否為今年抒蚜,今天悼院,昨天等判没,在進行時間差的比較啊送。為了代碼的封裝性和易用性。我們通常把比較時間差代碼封裝到分類篮洁,這些都是已經(jīng)封裝好的代碼涩维。詳情請看下面:)

時間未處理處理之前:

Snip20160404_2.png

時間經(jīng)過處理之后:

Snip20160404_1.png


-1 OC版的時間處理

  • 服務(wù)器返回的格式: 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.
/**
 * 這是一個處理時間的分類(用于計算服務(wù)器返回的時間與當(dāng)前時間比較)
 * 分為:
 *      今年 非今年
 *      今天 昨天  明天
 *      幾小時前 幾分鐘前 一分鐘以內(nèi)
 */

#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;
}

/** 是否是明天  (注:這個只是擴展,實際開發(fā)不會用到是否是明天的) */
- (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

外部調(diào)用(OC)

/**
*  拿到服務(wù)器返回的時間和當(dāng)前時間進行比較
*  返回一個字符串時間
*/
- (NSString *)created_at{
    // 1.創(chuàng)建NSDateFormatter對象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 1.1并日期格式化
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // 1.2拿到服務(wù)器返回的時間
    NSDate *creat = [fmt dateFromString:_created_at];
    
    // 2.判斷服務(wù)器返回的時間
    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;
    }
}
  • 注意:時間的格式要根據(jù)服務(wù)器返回的時間類型,要不然會轉(zhuǎn)換失敗

    • 日期格式化 根據(jù)服務(wù)器返回的時間類型確定
      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 {
    /**
    *  根據(jù)字符串轉(zhuǎn)換時間
    */
    class func dateWithString(str: String) -> NSDate? {
        // 1.創(chuàng)建時間格式化對象
        let formatter = NSDateFormatter()
        // 2.指定時間格式
        formatter.dateFormat = "EEE MM dd HH:mm:ss Z yyyy"
        // 3.指定時區(qū)
        formatter.locale = NSLocale(localeIdentifier: "en")
        // 4.轉(zhuǎn)換時間
        return formatter.dateFromString(str)
    }
    
    /**
    *   獲取當(dāng)前時間的格式
    *   返回一個字符串時間
    */
    func desStr() -> String{
        // 0.1.創(chuàng)建一個日歷類
        let calendar = NSCalendar.currentCalendar()
        
        // 0.2.利用日歷類從指定時間從獲取指定的組成成分
  
        // 1.1.創(chuàng)建時間格式化對象
        let formatter = NSDateFormatter()

        // 1.2.指定時區(qū)
        formatter.locale = NSLocale(localeIdentifier: "en")
        
        if calendar.isDateInToday(self){ // 2.1判斷是否是今天
            // 獲取當(dāng)前時間與指定時間的差值
            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一年以內(nèi)
            formatter.dateFormat = "MM-dd HH:mm"
            return formatter.stringFromDate(self)
        }else{ // 2.4更早時間
            formatter.dateFormat = "yyyy-MM-dd HH:mm"
            return formatter.stringFromDate(self)
        }
    }
}

外部調(diào)用(Swift)

// 設(shè)置以及處理過的時間
   var timeText: String?
 {
        // 守衛(wèi)
        guard let timeStr = status?.created_at else{
            return "" 
        }
        guard let date = NSDate.dateWithString(timeStr) else {
            return ""
        }
        return date.desStr()
  }


  • 3 Swift3.x版的時間處理

extension Date {
    /**
     *  根據(jù)字符串轉(zhuǎn)換時間
     */
    static func dateWithString(str: String) -> Date? {
        // 1.創(chuàng)建時間格式化對象
        let formatter = DateFormatter()
        // 2.指定時間格式
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 3.指定時區(qū)
        formatter.locale = Locale(identifier: "en")
        // 4.轉(zhuǎn)換時間
        return formatter.date(from: str)
    }
    
    /**
     *   獲取當(dāng)前時間的格式
     *   返回一個字符串時間
     */
    func desStr() -> String{
        // 0.1.創(chuàng)建一個日歷類
        let calendar = NSCalendar.current
        
        // 0.2.利用日歷類從指定時間從獲取指定的組成成分
        
        // 1.1.創(chuàng)建時間格式化對象
        let formatter = DateFormatter()
        
        // 1.2.指定時區(qū)
        formatter.locale = Locale(identifier: "en") //Locale(identifier: "en")
        
        
        if calendar.isDateInToday(self){ // 2.1判斷是否是今天
            // 獲取當(dāng)前時間與指定時間的差值
            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一年以內(nèi)
            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)
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市睡蟋,隨后出現(xiàn)的幾起案子踏幻,更是在濱河造成了極大的恐慌,老刑警劉巖戳杀,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该面,死亡現(xiàn)場離奇詭異,居然都是意外死亡信卡,警方通過查閱死者的電腦和手機隔缀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傍菇,“玉大人猾瘸,你說我怎么就攤上這事《埃” “怎么了牵触?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咐低。 經(jīng)常有香客問我揽思,道長,這世上最難降的妖魔是什么见擦? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任钉汗,我火速辦了婚禮,結(jié)果婚禮上锡宋,老公的妹妹穿的比我還像新娘儡湾。我一直安慰自己,他們只是感情好执俩,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布徐钠。 她就那樣靜靜地躺著,像睡著了一般役首。 火紅的嫁衣襯著肌膚如雪尝丐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天衡奥,我揣著相機與錄音爹袁,去河邊找鬼。 笑死矮固,一個胖子當(dāng)著我的面吹牛失息,可吹牛的內(nèi)容都是我干的譬淳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盹兢,長吁一口氣:“原來是場噩夢啊……” “哼邻梆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绎秒,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤浦妄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后见芹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剂娄,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年玄呛,在試婚紗的時候發(fā)現(xiàn)自己被綠了阅懦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡把鉴,死狀恐怖故黑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庭砍,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布混埠,位于F島的核電站怠缸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钳宪。R本人自食惡果不足惜揭北,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吏颖。 院中可真熱鬧搔体,春花似錦、人聲如沸半醉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩多。三九已至呆奕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衬吆,已是汗流浹背梁钾。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逊抡,地道東北人姆泻。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拇勃。 傳聞我的和親對象是個殘疾皇子四苇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容