iOS 時間處理(仿朋友圈徊都、微博發(fā)布時間)

仿朋友圈叉橱、微博時間.png
微博時間.png

前言

我們有時候做項目從網(wǎng)絡回調的時間數(shù)據(jù)并不是我們想要的類型曹锨,而是,這種格式的Sat Dec 03 19:56:38 +0800 2016,而我們需要轉成我們需要的時間例如: xx分鐘前/xx小時前/xx天前

OC

主要代碼及思路

  • 建立NSDate的分類舵盈,創(chuàng)建兩個方法一個返回NSDate毡咏,一個返回我們需要的時間格式
/** 獲取到的時間字符串轉成NSDate */
+ (NSDate * )timeStringToDate: (NSString *)timeString;
/** 把NSDate轉成自己需要的時間格式 */
- (NSString *)dateToRequiredString;
  • 方法的實現(xiàn)驮宴,因為會用到NSDateFormatterNSCalendar這兩個類,而這兩個類初始化的時候會非常耗時間血当,并且我們可能在不同的模塊都會用到處理過后的時間幻赚,所以創(chuàng)建成單例

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

/** formatter單例 */
+ (instancetype)sharedFormatter;
  • NSDate的方法:
    1.返回NSDate
+ (NSDate *)timeStringToDate: (NSString *)timeString {
    /** /// "Sat Dec 03 19:56:38 +0800 2016",根據(jù)回調的時間字符串制定不一樣的日期格式 */
    NSString * formatterString = @"EEE  MMM dd HH:mm:ss zzz yyyy";
    /** DateFormatter, Calendar初始化比較消耗內存, 定義成單例 */
    [HHDateFormatter sharedFormatter].dateFormat = formatterString;
    /** 指定區(qū)域,真機一定要指定 */
    [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

  • 實現(xiàn)的思路與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",根據(jù)回調的時間字符串制定不一樣的日期格式
        dateFormat.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
        /// 指定區(qū)域佳谦,真機一定要指定
        dateFormat.locale = Locale(identifier: "en")
        /// 把時間字符串,轉日期
        return dateFormat.date(from: timeString)!
    }
    
    func dateToShowTime() -> String {
        if calendar.isDateInToday(self) {
            /// 間隔秒數(shù)
            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

工具類地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钻蔑,一起剝皮案震驚了整個濱河市啥刻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咪笑,老刑警劉巖可帽,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窗怒,居然都是意外死亡映跟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門扬虚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來努隙,“玉大人,你說我怎么就攤上這事辜昵≥┠鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵堪置,是天一觀的道長躬存。 經常有香客問我,道長晋柱,這世上最難降的妖魔是什么优构? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮雁竞,結果婚禮上钦椭,老公的妹妹穿的比我還像新娘。我一直安慰自己碑诉,他們只是感情好彪腔,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著进栽,像睡著了一般德挣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上快毛,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天格嗅,我揣著相機與錄音,去河邊找鬼唠帝。 笑死屯掖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的襟衰。 我是一名探鬼主播贴铜,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绍坝?” 一聲冷哼從身側響起徘意,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轩褐,沒想到半個月后椎咧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡灾挨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年邑退,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劳澄。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜈七,靈堂內的尸體忽然破棺而出秒拔,到底是詐尸還是另有隱情,我是刑警寧澤飒硅,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布砂缩,位于F島的核電站,受9級特大地震影響三娩,放射性物質發(fā)生泄漏庵芭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一雀监、第九天 我趴在偏房一處隱蔽的房頂上張望双吆。 院中可真熱鬧,春花似錦会前、人聲如沸好乐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚万。三九已至,卻和暖如春临庇,著一層夾襖步出監(jiān)牢的瞬間反璃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工假夺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淮蜈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓侄泽,卻偏偏與公主長得像礁芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • 在iOS開發(fā)中柿扣,經常會遇到各種各樣的時間問題肖方,8小時時差,時間戳未状,求時間間隔俯画,農歷等等。解決辦法網(wǎng)上比比皆是司草,但大...
    真巧了_嘿閱讀 2,758評論 0 7
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內容...
    i得深刻方得S閱讀 4,631評論 1 9
  • iOS開發(fā)中艰垂,經常會遇到各種各樣的時間問題,8小時時差埋虹,時間戳猜憎,求時間間隔,農歷等等搔课。解決辦法網(wǎng)上比比皆是胰柑,但大多...
    小李龍彪閱讀 6,293評論 1 6
  • 1 //當前時間創(chuàng)建NSDate NSDate*myDate = [NSDatedate]; NSLog(@"my...
    小暖風閱讀 477評論 0 1
  • 年少青春,本該鮮衣怒馬爬泥,恣意瀟灑柬讨,但你有沒有暗戀過一個人?是那種小心翼翼的愛袍啡,不敢讓別人知道踩官,因為你怕別人會嘲笑你...
    阿遙閱讀 233評論 0 0